Spring Security是一种可以为基础的能力 Spring 企业应用系统提供声明式安全访问控制解决方案的安全框架。它提供了一组Bean,可以在Spring应用程序的上下文中配置,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。这些功能的实现离不开这六大Spring 核心组件Security。
一、SecurityContext
security安全检索上下文内容,验证信息存储通过验证后 在Securitycontext中。Securitycontext接口只定义了两种方法。事实上,它的主要功能是获取Authentication对象。
二、SecurityContextHolder
Securitycontextholder是一个holder,用于hold住securitycontext的例子。用户在典型的web应用程序中登录一次,然后通过会话ID进行识别。服务器缓存持续时间会话的主要信息。Spring 在Security中,在请求之间存储Securitycontext的责任落在Securitycontextersentersenter上。默认情况下,上下文将上下文存储为HTTP请求之间的HTTPSession属性。它将恢复上下文Securitycontextholder的每个请求,最重要的是在请求完成时删除securitycontextholder。Securitycontextholder是一个类别,他的功能方法是静态的。
Securitycontextholder可以设置指定的JVM策略(Securitycontext的存储策略),有三种策略:
1.MODE_THREADLOCAL:SecurityContext 存储在线程中。
2.MODE_INHERITABLETHREADLOCAL:SecurityContext 存储在线程中,但子线程可以在父线程中获得 SecurityContext。
3.MODE_GLOBAL:SecurityContext 所有线程都是一样的。
默认情况下,SecuritycontextHolder使用MODE_THREADLOCAL模式,即存储在当前线程中。
- Authentication
authentication 直译过来是“认证”Spring的意思 Security Authentication用于表示当前用户是谁,一般来说,你可以理解authentication是一组用户名密码信息。Authentication也是一个接口。
接口有分别获取四种get方法。
1.Authorities, 填写用户角色信息。
2.Credentials,直译,证书。密码填写。
3.Details ,用户信息。
4.Principal ,它填充了用户名。
因此,可以推断,实际上有这样的现类四个属性。这些方法的作用如下:
getAuthorities: 获取用户权限,通常获取用户的角色信息。
getCredentials: 获取证明用户认证的信息,通常是密码和其他信息。
getDetails: 获取用户的额外信息(这部分信息可以是我们用户表中的信息)
getPrincipal: 获取用户身份信息,在未经认证的情况下获取用户名,在认证的情况下获取用户名 UserDetails (Userdetails也是一个接口,其中包括getusername、getpassword等。).
isAuthenticated: 获取当前 Authentication 是否已经认证。
setAuthenticated: 设置当前 Authentication 是否已认证(true or false)。
- UserDetailsService
提到了Userdetails必须提到Userdetailsservice, Userdetailservice也是一个界面,loaduserbyusername只有一种方法。他可以用来获得Userdetails。
通常在spring 在security应用中,我们将定制一个customuserdetailsservice,实现userdetailservice接口和publice接口 UserDetails loadUserByUsername(final String login);方法。当我们实现loaduserbyusername方法时,我们可以通过查询数据库(或缓存或其他存储形式)获取用户信息,然后组装成userdetails(通常是org).springframework.security.core.userdetails.User,它继承自Userdetails。 并返回。
在实现loaduserbyusername方法,如果我们没有通过查库找到相关记录,我们需要抛出一个异常来告诉spring security来了“善后”。这种异常是org.springframework.security.core.userdetails.UsernameNotFoundException。
五、UserDetails
UserDetails,看命知义意味着用户信息。它存储用户信息,接口方法如下:
getAuthorites:获取用户权限本质上是用户的角色信息。
getPassword: 获取密码。
getUserName: 获取用户名。
isAccountNonExpired: 账户是否过期。
isAccountNonLocked: 账户是否被锁定。
isCredentialsNonExpired: 密码是否过期。
isEnabled: 账户是否可用。
- AuthenticationManager
AuthenticationManager 其功能是验证Authentication,如果验证失败,将抛出Authenticationexception异常。Authenticationexception是一个抽象类,因此代码逻辑不能实例化Authenticationexception异常和抛出,实际抛出的异常通常是实际类别,如disabledexception,LockedException,BadCredentialsexception等。BadCredentialsexception可能更常见,即密码错误。
这六大Spring Security核心组件只有相辅相成,共同运作才能促进Spring Security实至名归的安全框架!