spring-security的authentication模型

spring-security的核心是AuthenticationProvider

这个接口的核心就是authenticate()方法,它接受一个Authentication类型的参数:

这个Authentication类型的两个核心参数就是PrincipalCredentials。此外,Authentication还接受更细致的权限划分,提供一个getAuthorities()方法,去接受一系列的GrantedAuthority类型的参数:

上面是spring-security的一个基础的架子。后续核心要看的重点是DaoAuthenticationProvider

上面这个DaoAuthenticationProvider是基于数据库的。

spring-security的认证核心是userDetailServiceSpring Security: Database-backed UserDetailsService)。认证用的用户表很基础:

就是「用户名」和「密码」。JdbcDaoImpl是跟数据库打交道的class:

spring-security里面定义了用户表,和围绕着用户表的方法,不需要自己实现了。并且这个用户模型可以容纳所有的「认证」与「鉴权」的需求。从最简单的「用户名」+「密码」,到最复杂的「ACL」列表,全部都定义好了,根据自己的需求来使用就可以了。

多说一句spring的「鉴权」(Authorization)模型:AuthorizationAuthentication是分开的,Authentication只管「认证」。下面是一个spring-security实现的vote based鉴权模型(11. Authorization):

基于acl的鉴权模型(An Introduction to Spring Security ACL)位于spring-security-acl子项目里:

$ pwd
/Users/weli/works/spring-security/acl

它的项目里包含了数据库的建库sql脚本:

我们倒入sql,创建库表:

我们用vp uml反向工程这个数据库,得到er图:

上面这个模型可以实现最细颗粒度的鉴权。