过滤器与拦截器区别
springSecurity组成
springSecurity是由过滤器链组成 主要用于用户管理与权限验证 UsernamePasswordAuthenticationFilter 是其中一个过滤器主要用于 对post表中做拦截,检验表中数据的用户名与密码
springSecurity配置
DelegatingFilterProxy需要配置(spring boot 不需要) 配置的作用是将所有拦截器加载进来 ** 主要接口:** **userDetalsService:**主要用于对数据库密码,账户的查询 **passwordEncoder :**主要用于对密码的加密 **配置:**可以使用配置文件或者使用配置类设置用户名和密码(但是不实用,无法从数据库获取密码) 第三种配置方式 配置响应接口 配置文件
@Configuration
public class MySecurityConfig extends WebSecurityConfigurerAdapter {
// 实现userDetailsService接口 并将其注入
@Autowired
UserDetailsService userDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(password());
}
// 加密密码
@Bean
PasswordEncoder password(){
return new BCryptPasswordEncoder();
}
}
创建dao层user、role 实现多对多的关系 user实现userdetails 在user里面 重写获取授权的权限方法
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
List<GrantedAuthority> auths = new ArrayList<>();
// role表示存在的权限
List<Role> roles = this.getRoles();
for (Role role : roles) {
auths.add(new SimpleGrantedAuthority(role.getName()));
}
return auths;
}
使用mybatis 查找数据库密码做到用户管理 配置接口
@Service("userDetailsService")
public class MyUserDetailsService implements UserDetailsService {
// 使用mybatis查询
@Autowired
UserMapper userMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// 查询user用户
comayu.springsecurity.dao.User myuser=userMapper.selectUser(username);
// 判断是否存在
if(myuser==null){throw new UsernameNotFoundException("用户不存在");}
// 返回user
return new User;
}
}
配置security 登录页,认证权限,关闭csrf 认证,实现注销功能
@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin()
// 配置登录页
.loginPage("/admin")
//表单里面的地址 需要与 .loginProcessingUrl("")地址相等
.loginProcessingUrl("/admin/index")
// 成功也
.successForwardUrl("/admin/index")
//失败也
.failureUrl("/admin/error").permitAll();
http.authorizeRequests()
// 放行首页
.antMatchers("/admin/login","/admin").permitAll()
// 拦截
.antMatchers("/admin/**").hasRole("admin")
.anyRequest().permitAll();
http.logout()
.logoutUrl("/admin/logout")
.permitAll();
http.csrf().disable();
}
实现记住我功能 记住我
评论