角色继承
有时候角色与用户并不是完全一一对应的,在刚开始的时候,admin
用户可能只有ROLE_ADMIN
角色,manager
用户也只有ROLE_MANAGER
角色。
但如果希望给admin
用户授予manager
的角色,该怎么办呢?
这就需要用到Spring Security的角色继承
功能了。
自定义过滤器
有时某些业务或者功能,需要在用户请求到来之前就进行一些判断或执行某些动作,就像在Servlet中的FilterChain
过滤器所做的那样,Spring Security也有类似机制。
remember-me
保存到Cookie
在很多应用中,用户不必每次都输入用户名密码才能访问,而是通过勾选记住我(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
,否则抛出异常。
Spring Security是一个重量级的RBAC权限管理框架,当SpringMVC还是主流开发框架的时候,因为它的配置比较繁琐,所以事实上Shiro用得更多。
改造支付应用
Google Guava提供了EventBus(事件总线)机制,它是发布-订阅模式的实现,不需要显式地注册回调,比观察者模式更灵活。
从CPU高速缓存
、操作系统缓存
到HTTP缓存
,再到静态文件缓存
,IT系统中到处都有缓存的身影存在。
按照范围不同,缓存又分为进程内缓存
和进程外缓存
按照架构不同,它又分为本地缓存
和分布式缓存
。
而进程内缓存
又分为组件缓存
和第三方缓存
。
-
组件缓存
是在程序内使用变量来存储数据,例如,Java中的List
、Map
和Set
等集合组件就常常用作这样的缓存。 -
第三方缓存
是利用第三方组件在系统运行时存储数据,例如,目前用的比较多的Ehcache和Guava Cache。