角色继承
有时候角色与用户并不是完全一一对应的,在刚开始的时候,admin
用户可能只有ROLE_ADMIN
角色,manager
用户也只有ROLE_MANAGER
角色。
但如果希望给admin
用户授予manager
的角色,该怎么办呢?
这就需要用到Spring Security的角色继承
功能了。
有时候角色与用户并不是完全一一对应的,在刚开始的时候,admin
用户可能只有ROLE_ADMIN
角色,manager
用户也只有ROLE_MANAGER
角色。
但如果希望给admin
用户授予manager
的角色,该怎么办呢?
这就需要用到Spring Security的角色继承
功能了。
有时某些业务或者功能,需要在用户请求到来之前就进行一些判断或执行某些动作,就像在Servlet中的FilterChain
过滤器所做的那样,Spring Security也有类似机制。
在很多应用中,用户不必每次都输入用户名密码才能访问,而是通过勾选记住我(remember-me)
来让浏览器Cookie记住用户的登录状态,以便下次无需登录就能访问应用。
Spring Security实现这个功能很简单,只需要对WebSecurityConfiguration
做一点小改动即可。
之前除了/login
接口能成功,另外两个都失败并不是因为代码问题,而是Spring Security默认是通过Web页面来实现页面逻辑跳转的。
但在前后端分离的开发模式中,页面跳转的逻辑后端已经不能直接控制了,而是通过返回状态码由前端来执行跳转,因此,需要对应用进行改造,自定义一个登录成功处理器。
要定义这样的处理器,只需要实现Spring Security预先提供的一系列接口XXXHandler
接口就行了。
在开始配置Spring Security之前,有必要大致了解一下它的登录流程做个。
Spring Security进行身份验证的是AuthenticationManager
接口。
ProviderManager
是AuthenticationManager
的一个默认实现。
ProviderManager
把验证工作委托给了AuthenticationProvider
接口。
AuthenticationProvider
的实现类DaoAuthenticationProvider
会检查身份认证。
DaoAuthenticationProvider
又把认证工作委托给了UserDetailsService
接口。
自定义UserDetailsService
类从数据库中获取用户账号、密码、角色等信息,然后封装成UserDetails
返回。
使用Spring Security还需要自定义AuthenticationProvider
接口,获取用户输入的账号、密码等信息,并封装成Authentication
接口。
将UserDetails
和Authentication
进行比对,如果一致就返回UsernamePasswordAuthenticationToken
,否则抛出异常。