标签:problems parent password 手册 访问控制 support real useful can
原文出自 https://spring.io/guides/topicals/spring-security-architecture
Application security boils down to two more or less independent problems: authentication (who are you?) and authorization (what are you allowed to do?). Sometimes people say "access control" instead of "authorization" which can get confusing, but it can be helpful to think of it that way because "authorization" is overloaded in other places. Spring Security has an architecture that is designed to separate authentication from authorization, and has strategies and extension points for both.
The main strategy interface for authentication is AuthenticationManager
which only has one method:
身份验证的主要策略接口是 AuthenticationManager ,它只有一个方法:
public interface AuthenticationManager { Authentication authenticate(Authentication authentication) throws AuthenticationException; }
An AuthenticationManager
can do one of 3 things in its authenticate()
method:
AuthenticationManager可以在authenticate()方法中执行以下三种操作之一:
1、return an Authentication
(normally with authenticated=true
) if it can verify that the input represents a valid principal.
1、如果它可以验证输入是否代表有效的主体,则返回身份验证(通常使用authenticated = true)。
AuthenticationException
if it believes that the input represents an invalid principal.null
if it can’t decide.AuthenticationException
is a runtime exception. It is usually handled by an application in a generic way, depending on the style or purpose of the application. In other words user code is not normally expected to catch and handle it. For example, a web UI will render a page that says that the authentication failed, and a backend HTTP service will send a 401 response, with or without a WWW-Authenticate
header depending on the context.AuthenticationManager
is ProviderManager
, which delegates to a chain of AuthenticationProvider
instances. An AuthenticationProvider
is a bit like an AuthenticationManager
but it has an extra method to allow the caller to query if it supports a given Authentication
type:public interface AuthenticationProvider { Authentication authenticate(Authentication authentication) throws AuthenticationException; boolean supports(Class<?> authentication); }
The Class<?>
argument in the supports()
method is really Class<? extends Authentication>
(it will only ever be asked if it supports something that will be passed into the authenticate()
method). A ProviderManager
can support multiple different authentication mechanisms in the same application by delegating to a chain of AuthenticationProviders
. If a ProviderManager
doesn’t recognise a particular Authentication
instance type it will be skipped.
supports()方法中的Class <?>参数实际上是Class <?扩展身份验证>(只会询问它是否支持将传递给authenticate()方法的内容)。通过委派给AuthenticationProviders链,ProviderManager可以在同一个应用程序中支持多种不同的身份验证机制。如果ProviderManager无法识别特定的身份验证实例类型,则会跳过它。
A ProviderManager
has an optional parent, which it can consult if all providers return null
. If the parent is not available then a null
Authentication
results in an AuthenticationException
.
Sometimes an application has logical groups of protected resources (e.g. all web resources that match a path pattern /api/**
), and each group can have its own dedicated AuthenticationManager
. Often, each of those is a ProviderManager
, and they share a parent. The parent is then a kind of "global" resource, acting as a fallback for all providers.
Figure 1. An AuthenticationManager
hierarchy using ProviderManager
Spring Security provides some configuration helpers to quickly get common authentication manager features set up in your application. The most commonly used helper is the AuthenticationManagerBuilder
which is great for setting up in-memory, JDBC or LDAP user details, or for adding a custom UserDetailsService
. Here’s an example of an application configuring the global (parent)
@Configuration public class ApplicationSecurity extends WebSecurityConfigurerAdapter { ... // web stuff here @Autowired public initialize(AuthenticationManagerBuilder builder, DataSource dataSource) { builder.jdbcAuthentication().dataSource(dataSource).withUser("dave") .password("secret").roles("USER"); } }
This example relates to a web application, but the usage of AuthenticationManagerBuilder
is more widely applicable (see below for more detail on how web application security is implemented). Note that the AuthenticationManagerBuilder
is @Autowired
into a method in a @Bean
- that is what makes it build the global (parent) AuthenticationManager
. In contrast if we had done it this way:
@Configuration public class ApplicationSecurity extends WebSecurityConfigurerAdapter { @Autowired DataSource dataSource; ... // web stuff here @Override public configure(AuthenticationManagerBuilder builder) { builder.jdbcAuthentication().dataSource(dataSource).withUser("dave") .password("secret").roles("USER"); } }
(using an @Override
of a method in the configurer) then the AuthenticationManagerBuilder
is only used to build a "local" AuthenticationManager
, which is a child of the global one. In a Spring Boot application you can @Autowired
the global one into another bean, but you can’t do that with the local one unless you explicitly expose it yourself.
AuthenticationManager
(with just one user) unless you pre-empt it by providing your own bean of type AuthenticationManager
. The default is secure enough on its own for you not to have to worry about it much, unless you actively need a custom global AuthenticationManager
. If you do any configuration that builds an AuthenticationManager
you can often do it locally to the resources that you are protecting and not worry about the global default.
标签:problems parent password 手册 访问控制 support real useful can
原文地址:https://www.cnblogs.com/shuaiandjun/p/10116662.html