一.前言
看过我的上篇文章《SpringSecurity3.1入门教程(一)》,相信对SS也有个大概的了解了,这篇文章就来深入的讲解下SS的一些概念及功能。
SpringSecurity3.1入门教程(一):{
网址:http://blog.csdn.net/u012557538/article/details/49953017 例子源码:http://download.csdn.net/detail/u012557538/9287445}
二.接口
1.Authentication:认证对象,主体对象,主要包含getAuthorities();getPrincipal();方法。就是说主要由权限(角色)对象和 用户对象组成,需要注意的是这里的用户对象UserDetails,它是Security内设定的包含6个属性的接口,在UserDetails和拓展UserDetails会继续讲解。
2.SecurityContextHolder:提供几种访问SecurityContext的方式。
3.SecurityContext:保存Authentication信息,和请求对应的安全信息。
4.HttpSessionContextIntegrationFilter,为了在不同请求使用,把SecurityContext保存到 HttpSession里。
5.GrantedAuthority;赋予到主体的角色,只有一个方法。String getAuthority();
6.AuthenticationManager :接口,认证管理器。
7.AuthenticationProviders :认证供应器。
当我们使用 authentication-provider 元素来定义一个 AuthenticationProvider 时,如果没有指定对应关联的 AuthenticationProvider 对象,Spring Security 默认会使用 DaoAuthenticationProvider。DaoAuthenticationProvider 在进行认证的时候需要一个 UserDetailsService 来获取用户的信息 UserDetails。所以如果我们需要改变认证的方式,比如说增加个验证码,我们可以实现自己的 AuthenticationProvider;如果需要改变认证的用户信息来源,我们可以实现 UserDetailsService和扩展UserDetails。
8.UserDetailsService:接口,它提供了获得保证 非空的认证信息,比如用户名,密码,授予的权限和用户账号是可用还是禁用。
只有一个loadUserByUsername(name)方法,这个方法最主要的目的是要返回一个UserDetails对象。返回后Security内部会借助这个对象和用户输入的用户名和密码进行匹配,匹配成功则认证成功,可认证成功并不说明你就能登录系统了,认证完还要进一步验证授权状况,即查看你是否有权限查看请求的资源。
9.UserDetails:接口。它还有个实现类User。UserDetails是组成Authentication对象的一部分,对应Authentication的getPrincipal();
默认的UserDetails有6个方法
public interface UserDetails extends Serializable {
GrantedAuthority[] getAuthorities();
String getPassword();
String getUsername();
boolean isAccountNonExpired();//账号是否过期
boolean isAccountNonLocked();//账号是否锁定(多次输错密码)
boolean isCredentialsNonExpired();//密码是否过期
boolean isEnabled();//是否被禁用
}
10.AccessDecisionManager:决策管理器,负责最终访问控制的决定,说白了就是我来决定你可以访问什么资源(url,method),它有一个 decide方法,可以获得一个 Authentication对象。展示主体的请求权限
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
三.认证流程
1.用户输入用户名和密码提交请求(注意,security默认是只支持用户名和密码)
2.security过滤器拦截用户请求,进行认证,认证会调用认证管理器,认证供应器和用户信息细节接口,
3.(硬编码的UserDetailsService就不讲解了,这里针对自定义UserDetailsService来讲)。拦截后自动进入UserDetailsService调用loadUserByUsername(name)通过用户名查找用户,这里要搞清楚这里的参数name你表单填写好后提交请求会自动传递到该方法参数,如果用户不存在则抛出异常,若用户A存在,则需进一步构造UserDetails对象,(其实就是构造UserDetailsd的实现类User对象),此时需要获取用户A的用户名,密码,账号是否可用等,(用户名和密码是必须的),由于设计数据库时用户和角色的对应关系在另外一张表上,所以要另外通过DAO获取到用户拥有的角色。然后构造UserDetails,构造完返回这个对象就可以了,我们并不需要显示调用loadUserByUsername方法,Security内部会自动调用,然后通过这个UserDetails对象来匹配用户表单输入的用户名和密码,如果匹配,则认证成功,然后验证授权状况,授权也通过,则匹配 <form-login default-target-url="/index.jsp">跳转到指定页面。
OK,基本概念说完了,下篇开始就开始讲解Security的一些配置,功能之类的。