<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>2.3.0</version>
</dependency>
name默认是user
密码
image.png
Spring Security本质是一个过滤器链,有很多的过滤器
有三个重要的过滤器
1.FilterSecurityInterceptor:是一个方法级的权限过滤器,基本位于过滤器的最底部。
2.ExceptionTranslationFilter:是个异常过滤器,用来处理在认证授权过程中抛出的异常。
image.png3.UsernamePasswordAuthenticationFilter对/login的post请求做拦截,检验表单中用户名、密码。
两个重要的接口
1.UserDetailService接口:查询数据库用户名和密码过程
*创建类继承UsernamePasswordAuthenticationFilter,重写三个方法(accept/success/unsuccess)
- 创建类实现UserDetailService:编写查询数据过程,返回User对象,这个User对象是安全框架提供的对象。
2.PasswordEncoder 接口
用于数据密码的加密
配置类设置账户密码
/**
* @author qiz
*/
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception{
BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
String encode = bCryptPasswordEncoder.encode("123");
auth.inMemoryAuthentication().withUser("lucy").password(encode).roles("admin");
}
@Bean
PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
}
自定义实现类
/**
* @author qiz
*/
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception{
auth.userDetailsService(userDetailsService).passwordEncoder(password());
}
@Bean
PasswordEncoder password(){
return new BCryptPasswordEncoder();
}
}
/**
* @author qiz
*/
@Service("userDetailsService")
public class UserDetailService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
List<GrantedAuthority> auths = AuthorityUtils.commaSeparatedStringToAuthorityList("role");
return new User("mary",new BCryptPasswordEncoder().encode("123"),auths);
}
}
image.png连接数据库
image.png
@Override
protected void configure(HttpSecurity http) throws Exception{
//配置没有权限访问跳转自定义页面
http.exceptionHandling().accessDeniedPage("/error/404.html");
//自定义自己编写的登录页面
http.formLogin()
//登录页面设置
.loginPage("/login.html")
//登录访问路径
.loginProcessingUrl("/user/login")
//登录成功之后,跳转的路径
.defaultSuccessUrl("/user/index")
.and().authorizeRequests()
//直接访问,不需要认证
.antMatchers("/test/add","/user/login").permitAll()
//其他请求需要认证
// .anyRequest().authenticated()
//具有某个权限才能访问
// .antMatchers().hasAuthority()
//有多个权限
// .antMatchers().hasAnyAuthority()
//具有指定角色
// .antMatchers().hasRole() ROLE_sale
.and().csrf().disable();
}
image.png
image.png
image.png使用注解
image.png
image.png
hasAnyAuthority与hasAnyRole区别
Role前面必须加ROLE_,因为获取角色是会加ROLE_。
用户退出
image.png
记住我
image.png
image.png
网友评论