- 1、导入依赖
- 2、自定义MyUserDetailService
- 3、SecurityConfig(重点)
- 如何获取登录用户
- 自定义User
2、自定义MyUserDetailServiceorg.springframework.boot spring-boot-starter-security org.thymeleaf.extras thymeleaf-extras-springsecurity5 org.springframework.security spring-security-test test
要实现UserDetailsService 接口
@Service
public class MyUserDetailService implements UserDetailsService {
@Resource
MemberinfoMapper memberinfoMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
MemberinfoExample example = new MemberinfoExample();
MemberinfoExample.Criteria criteria = example.createCriteria();
criteria.andNicknameEqualTo(username);
List memberinfos = memberinfoMapper.selectByExample(example);
String name = memberinfos.get(0).getNickname();
String pwd = memberinfos.get(0).getPwd();
String role = memberinfos.get(0).getPhoto();
// 角色集合
List authorities = new ArrayList<>();
// 角色必须以`ROLE_开头,数据库中没有,则在这里加
authorities.add(new SimpleGrantedAuthority(role));
System.out.println("角色:"+memberinfos.get(0));
if (memberinfos.size()>0) { //数据库已经加密过了 不需要再加密了
return new User(name, pwd,
// role
authorities
// AuthorityUtils.commaSeparatedStringToAuthorityList(role)
);
}
else {
throw new UsernameNotFoundException("用户""+username+""不存在!");
}
}
}
3、SecurityConfig(重点)
//AOP:拦截器
@EnableWebSecurity
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true) // 开启方法级安全验证
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Resource
MyUserDetailService myUserDetailService; //第二部中我们自己定义的
//链式变成
//授权请求
@Override
protected void configure(HttpSecurity http) throws Exception {
//首页所有人可以访问 功能也只有对应权限的人才能访问
http.authorizeRequests()
.antMatchers("/").permitAll() //首页所有人可以访问
.antMatchers("/user
//认证规则里的用户从我们自定义的MyUserDetailService里读取,并用BCryptPasswordEncoder加密
// 2. 推荐使用我们自己指定的逻辑(用户、密码、角色权限)
auth.userDetailsService(myUserDetailService)
.passwordEncoder(encoder) //一定要加密
;
}
}
如何获取登录用户
//获取上下栈
SecurityContext context = SecurityContextHolder.getContext();
Authentication authentication1 = context.getAuthentication();
User principal = (User)authentication1.getPrincipal(); //这个就是我们在步骤2中写的User
后续可以将用户自己封装到session中
自定义User我们如果不用系统的User,也可以自己指定,但是使用的时候出现了一些问题,最后还是决定用系统配的User
只需要将我们自己定义的User实现UserDetails接口,重写方法即可



