赞
踩
一、基本概念
1.1 认证方式
1.1.1 基于session方式认证
他的流程是:用户认证成功后,服务端生成相应的用户数据保存在session中,发给客户端的session_id保存在cookie中。这样用户请求时只要带上session_id就可以验证服务端是否存在session,以此完成用户的校验。当用户退出系统或session过期时,客户端的session_id也就无效了。
1.1.2 基于token认证方式
他的流程是:用户认证成功后,服务端生成一个token发给客户端,客户端放到cookie或localStorage等存储中,每次请求带上token,服务端收到后就可以验证。
1.2 什么是授权
授权:用户认证通过后根据用户的权限来控制用户访问资源的过程。
1.3 权限模型
最简单权限表设计。
二、快速入门
2.1 用户认证
先自行搭建一个SpringMvc或者SpringBoot项目.
2.1.1 引入依赖
org.springframework.boot
spring-boot-starter-security
2.1.2 配置类
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
/**
* 配置用户信息服务
* @return
*/
@Bean
public UserDetailsService userDetailsService(){
InMemoryUserDetailsManager manager=new InMemoryUserDetailsManager();
manager.createUser(User.withUsername("zhangsan").password("123").authorities("p1").build());
manager.createUser(User.withUsername("lisi").password("456").authorities("p2").build());
return manager;
}
/**
* 密码编码器
* @return
*/
@Bean
public PasswordEncoder passwordEncoder(){
return NoOpPasswordEncoder.getInstance();
}
/**
* 安全拦截机制
* @param http
* @throws Exception
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/r/**").authenticated()
.anyRequest().permitAll()
.and()
.formLogin()
.successForwardUrl("/login-success");
}
}
2.1.3 测试资源访问
写一个controller进行测试.
@RestController
public class ResourceController {
@RequestMapping("/r/r1")
public String r1(){
return "访问资源1";
}
@RequestMapping("/r/r2")
public String r2(){
return "访问资源2";
}
}
直接访问http://localhost:8080/r/r2,会跳到登陆页面,登陆成功后访问则成功.
以上就利用SpringSecurity完成来了认证功能.
2.2 资源控制
只需在antMatchers("/r/r1").hasAnyAuthority("p1")方法上加上hasAnyAuthority就可以了.
这个方法代表要访问/r/r1,必须得有p1权限.
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/r/r1").hasAnyAuthority("p1")
.antMatchers("/r/r2").hasAnyAuthority("p2")
.anyRequest().permitAll()
.and()
.formLogin()
.successForwardUrl("/login-success");
}
注意:规则的顺序很重要,具体的规则要放在最上面,permitAll这种放在下面
三、工作原理
Spring Security对资源对保护是通过filter来实现对,当初始化Spring Security时,会创建一个名为SpringSecurityFilterChain的Servlet过滤器,类型为FilterChainProxy,他实现了javax.servlet.Filter接口,因此外部的请求会经过此类.
SpringSecurity的功能主要是通过过滤器链来完成的.
下面介绍几个主要的拦截器:
SecurityContextPersistenceFilter:整个拦截过程的入口和出口
UsernamePasswordAuthenticationFilter:用于处理来自表单提交的认证
FilterSecurityInterceptor:用于保护web资源的
ExceptionTranslationFilter:能够捕获FilterChain的所有异常并处理.
认证过程:
3.1 改为从数据库查询用户
实现UserDetailsService接口
@Service
public class MyUserDetailService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//这里可以写从数据库查的逻辑
UserDetails userDetails = User.withUsername(username).password("123").authorities("p1").build();
return us
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。