Currently, all Spring Security's @Enable annotations are meta-annotated with @Configuration. While convenient, this is not consistent with the rest of the Spring projects and most notably Spring Framework's @Enable annotations.

Additionally, the introduction of support for @Configuration(proxyBeanMethods=false) in Spring Framework provides a compelling reason to remove @Configuration meta-annotation from Spring Security's @Enable annotations and allow users to opt into their preferred configuration mode.

Comment From: sjohnr

Note that we will want to update the documentation examples to include @Configuration in places where it's currently missing.

Comment From: jsattler

@sjohnr I would like to help on this, as I was anyhow looking into the documentation part.

Comment From: sjohnr

It's yours @jsattler! Keep in mind we'll want to update the reference documentation, javadoc and samples. I'll open a ticket to update the samples, and if you don't feel you can tackle that part just let me know.

Comment From: jsattler

@sjohnr I will take care of the reference documentation, javadoc and samples. The actual removal of the @Configuration from the @Enable* annotations will be tackled in a separate PR, as this seems to be a breaking change, correct? If it is tackled in a separate PR should I anyhow already update the tests using only @Enable*?

Comment From: sjohnr

@jsattler yes, please do update tests if necessary! I think it can be done under this issue, but if you would like a separate issue let me know. And yes, this is a breaking change so I believe it will only be done in 6.0 (main). @rwinch can correct me if I'm wrong.

Comment From: jsattler

Quite some files changed, hope that's okay for a single PR. If you have any suggestions to split this up, please let me know.

Comment From: rwinch

A note for self. I used the following to check for missing @Configuration:

import re
import sys


enable_regex = r".*@Enable[a-zA-Z]+(Security|Authentication).*"
config_regex = r".*@Configuration.*"
A = 2
B = 2

file_name = sys.argv[1]
try:
    file = open(file_name, 'r')
    lines = file.readlines()
except Exception as err:
    print ("Could not open file:", file_name, repr(err))
    sys.exit()


def find_regex_in_range(lines, regex, range):
    for index in range:
        peek_line = lines[index - 1]
        if (re.match(regex, peek_line)):
            return True
    return False

def print_range(lines, range):
    for index in range:
        peek_line = lines[index - 1]
        print(f"{index} {peek_line}", end = "")

line_count = 0

for line in lines:
    line_count += 1
    if (re.match(enable_regex, line)):
        before_range = range(line_count - B, line_count)
        after_range = range(line_count + 1, line_count + A + 1)
        if (find_regex_in_range(lines, config_regex, before_range) or find_regex_in_range(lines, config_regex, after_range)):
            continue
        print (f"{file_name}")
        print ("---")
        print_range(lines, before_range)
        print (f"{line_count} {line}", end = "")
        print_range(lines, after_range)
        print ("---")

Then run

 rg . -l | xargs -I{} python find-enable.py

Comment From: rwinch

Closing in favor of gh-11653