Spring实战第四版保护Web应用笔记
所属分类 spring
浏览量 927
Spring Security 声明式 安全框架
Web请求级别(URL)和 方法调用级别 身份认证和授权
从两个角度来解决安全性问题
使用Servlet规范中的Filter保护Web请求并限制URL级别的访问
使用Spring AOP保护方法调用,确保只有具备适当权限的用户才能访问安全保护的方法
认证 Authentication 和 授权 Authorization
认证用来确定当前用户
授权判断一个用户是否有访问某个安全对象的权限
Spring Security模块
配置 config
核心 core 包含核心的 authentication 和authorization 的类和接口
Web 包含filters和相关web安全的基础代码
标签库
ACL acess control list
切面
CAS Central Authentication Service
加密
LDAP Lightweight Directory Access Protocol
OpenID
remoting
Spring Security用户认证
多种的用户认证策略
1.基于内存的用户存储
2.基于数据库表进行认证
3.基于LDAP进行用户认证
基于XML
web.xml 配置SpringSecurity
DelegatingFilterProxy是Servlet Filter的代理类
通过这个类可以让Servlet Filter通过Spring来管理
它可以链接任意多个其他的过滤器,根据这些过滤器提供不同的安全特性
springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
springSecurityFilterChain
/*
spring-security.xml
静态资源不需要安全验证
基于Java配置
实现 WebSecurityConfigurerAdapter 类
使用 @EnableWebSecurity注解
Spring Security会生成一串密码(用户名默认 user)
Using generated security password: xxxxxxx
两个基本配置
httpSecurity和AuthenticationManager
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
authenticationManagerBuilder
.inMemoryAuthentication()
.passwordEncoder(new BCryptPasswordEncoder())
.withUser("admin")
.password(new BCryptPasswordEncoder().encode("admin"))
.roles("USER", "ADMIN");
}
}
只拥有ROLE_USER角色,访问ROLE_ADMIN的资源会被拒绝
Spring Security中的重要组件
SecurityContextHolder/SecurityContext
SecurityContextHolderStrategy
GlobalSecurityContextHolderStrategy
ThreadLocalSecurityContextHolderStrategy
InheritableThreadLocalSecurityContextHolderStrategy
Authentication UserDetails Principal GrantedAuthority
Authentication存储当前用户的主要信息
public interface Authentication extends Principal, Serializable {
// 获取当前用户被授权的角色,比如ROLE_USER,ROLE_ADMIN
Collection extends GrantedAuthority> getAuthorities();
// 与web身份验证相关的http请求信息,
Object getCredentials();
// 存储一些额外的信息,其实就是SessionId和客户端请求的Ip
Object getDetails();
// 存放用户的身份信息,比如用户名、密码等(可以强制转换为UserDetails)
Object getPrincipal();
// 是否通过认证
boolean isAuthenticated();
void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException;
}
System.out.println("sessionID:" + ((WebAuthenticationDetails)SecurityContextHolder.getContext().getAuthentication().getDetails()).getSessionId() +
" User:" + ((UserDetails)SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getUsername() +
" current thread:" + Thread.currentThread().getId() + "-" + Thread.currentThread().getName());
System.out.println("authority list:");
for (GrantedAuthority authorityGranter : SecurityContextHolder.getContext().getAuthentication().getAuthorities()) {
System.out.println(authorityGranter.getAuthority());
}
AuthenticationManager ProviderManager AuthenticationProvider
AuthenticationManager 处理认证请求,
该接口只有一个authenticate方法
认证通过时,返回一个封装了当前用户信息的Authentication对象
public interface AuthenticationManager {
Authentication authenticate(Authentication authentication)
throws AuthenticationException;
}
AuthenticationProvider
默认 DaoAuthenticationProvider
UserDetailsService 获取用户信息 UserDetails,其中包括用户名、密码和所拥有的权限等
Spring Security 用户认证 步骤
1.用户使用用户名和密码登录
2.Spring Security 用户名和密码封装成一个Authentication接口的实现类
比如常用的
UsernamePasswordAuthenticationToken(用户名密码认证)
AnonymousAuthenticationToken(匿名认证)
RememberMeAuthenticationToken(记住身份认证)
3.将Authentication对象传递给AuthenticationManager的实现类ProviderManager进行认证
4.ProviderManager依次调用各个AuthenticationProvider进行认证
AbstractUserDetailsAuthenticationProvider authenticate方法
retrieveUser方法获取一个userDetails对象(可以自定义,比如从数据库中获取)
additionalAuthticationChecks 进行用户认证
PasswordEncoder isPassordValid 方法进行验证
PlaintextPasswordEncoder (明文 不加密)
认证成功后返回一个封装了用户权限等信息的Authentication对象
5.将AuthenticationManager返回的Authentication对象赋予给当前的SecurityContext
spring security 模块简介
上一篇
下一篇
SpringFactoriesLoader 简介
Springboot自动配置原理简介
spring security 模块简介
Spring Security和Shiro简单比较
Shiro简介
通配符和正则的区别