Spring security 如果用户未经授权,Spring Security如何重定向到登录页面 spring security的内部授权机制是什么 如果用户未输入有效凭据,如何将URL重定向到/Login 谁对这次行动负责 项目的内部流程是什么
所有重要的魔法都在黑暗中 在某个时刻,某些组件检查请求是否经过身份验证。通常它是最后一个过滤器-(根据请求路径检查访问条件),但它可以是Spring security 如果用户未经授权,Spring Security如何重定向到登录页面 spring security的内部授权机制是什么 如果用户未输入有效凭据,如何将URL重定向到/Login 谁对这次行动负责 项目的内部流程是什么,spring-security,Spring Security,所有重要的魔法都在黑暗中 在某个时刻,某些组件检查请求是否经过身份验证。通常它是最后一个过滤器-(根据请求路径检查访问条件),但它可以是MethodSecurityInterceptor(@securited注释检查),甚至可以是您自己的自定义代码。重要的是,此检查将以抛出AuthenticationException或AccessDeniedException结束 下一个重要组成部分是。此筛选器检查引发的异常是AuthenticationException还是AccessDeniedExcep
MethodSecurityInterceptor
(@securited
注释检查),甚至可以是您自己的自定义代码。重要的是,此检查将以抛出AuthenticationException
或AccessDeniedException
结束
下一个重要组成部分是。此筛选器检查引发的异常是AuthenticationException
还是AccessDeniedException
,并调用已配置的AuthenticationEntryPoint
。根据配置的身份验证机制,这可能会发送重定向到登录页面或401响应,并带有WWW-Authenticate
标题(例如基本身份验证)
因此,基于表单登录的整个过程看起来是这样的(看起来可能很混乱,但实际上设计得很好,一旦您理解了原理,就不会那么复杂):
- 未经身份验证的用户向
/foo.html
- 通过
根据安全表达式检查请求FilterSecurityInterceptor
并抛出isAuthenticated()
AccessDeniedException
- 抛出的异常由
捕获,它依次调用ExceptionTranslationFilter
LoginRuThenticationEntryPoint
- 入口点发送
重定向响应到301
/login.html
- 通过
- 用户向
/login.html
- 请求由
检查,对于此路径,允许匿名访问FilterSecurityInterceptor
- 登录表单将呈现给用户
- 请求由
- 用户填写登录表单并以
POST/login.html
- 此请求被身份验证处理筛选器
UsernamePasswordAuthenticationFilter
- 提取用户名和密码,并调用
执行实际身份验证(实际身份验证委托给其他组件-通常是AuthenticationManager
和DAOAAuthenticationProvider
)UserDetailsService
- 身份验证成功,并且
令牌标记为身份验证
,并置于已验证
(因此它可用于其他组件)SecurityContextHolder
- 正在调用AuthenticationSuccessHandler,这可能会将用户重定向回
/foo.html
- 在向上的过程中,成功的身份验证被
(检查SecurityContextPersistenceFilter
)拾取,它将身份验证存储在HTTP会话上SecurityContextHolder
- 此请求被身份验证处理筛选器
- 用户再次请求
/foo.html
将身份验证从会话恢复到SecurityContextPersistenceFilter
SecurityContextHolder
再次检查您的访问规则,并允许对新验证的请求进行进一步处理(即调用dispatcher servlet)FilterSecurityInterceptor
- 用户享受自己的
/foo.html
MethodSecurityInterceptor
(@securited
注释检查),甚至可以是您自己的自定义代码。重要的是,此检查将以抛出AuthenticationException
或AccessDeniedException
结束
下一个重要组成部分是。此筛选器检查引发的异常是AuthenticationException
还是AccessDeniedException
,并调用已配置的AuthenticationEntryPoint
。根据配置的身份验证机制,这可能会发送重定向到登录页面或401响应,并带有WWW-Authenticate
标题(例如基本身份验证)
因此,基于表单登录的整个过程看起来是这样的(看起来可能很混乱,但实际上设计得很好,一旦您理解了原理,就不会那么复杂):
- 未经身份验证的用户向
/foo.html
- 请求由
根据您的安全表达式FilterSecurityInterceptor
进行检查,并抛出isAuthenticated()
AccessDeniedException
- 抛出的异常由
捕获,它依次调用ExceptionTranslationFilter
LoginRuThenticationEntryPoint
- 入口点将
重定向响应发送到301
/login.html
- 请求由
- 用户向
/login.html
- 请求由
检查,对于此路径,允许匿名访问FilterSecurityInterceptor
- 登录表单将呈现给用户
- 请求由
- 用户填写登录表单并以
POST/login.html
- 此请求被身份验证处理筛选器
UsernamePasswordAuthenticationFilter
- 提取用户名和密码,并调用
执行实际身份验证(实际身份验证委托给其他组件-通常是AuthenticationManager
和DAOAAuthenticationProvider
)UserDetailsService
- 身份验证成功并且
令牌无效身份验证
- 此请求被身份验证处理筛选器