首页  

Spring实战第四版保护Web应用笔记     所属分类 spring 浏览量 183
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来管理 它可以链接任意多个其他的过滤器,根据这些过滤器提供不同的安全特性 <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> spring-security.xml 静态资源不需要安全验证 <http pattern="/resources/**" security="none"/> <http auto-config="true" use-expressions="false"> <intercept-url pattern="/admin**" access="ROLE_ADMIN" /> <intercept-url pattern="/user**" access="ROLE_USER" /> <!-- HTTP基本认证 <http-basic/> --> <!-- 通过form-login设置自定义的登陆界面 <form-login/> --> <!-- 通过logout设置退出登陆地址等 <logout/> --> </http> <authentication-manager> <authentication-provider> <user-service> <user name="admin" password="admin" authorities="ROLE_ADMIN" /> <user name="dyyx" password="123456" authorities="ROLE_USER" /> </user-service> </authentication-provider> </authentication-manager>
基于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简介

通配符和正则的区别