一、关于 SpringSecurity
在 Spring Boot 出现之前,SpringSecurity 的使用场景是被另外一个安全管理框架 Shiro 牢牢霸占的,因为相对于 SpringSecurity 来说,SSM 中整合 Shiro 更加轻量级。Spring Boot 出现后,使这一情况情况大有改观。正应了那句古话:一人得道鸡犬升天,虽然有点不大合适,就将就着用吧。
这是因为 Spring Boot 为 SpringSecurity 提供了自动化配置,大大降低了 SpringSecurity 的学习成本。另外,SpringSecurity 的功能也比 Shiro 更加强大。
二、关于 JWT
JWT,是目前最流行的一个跨域认证解决方案:客户端发起用户登录请求,服务器端接收并认证成功后,生成一个 JSON 对象(如下所示),然后将其返回给客户端。
从本质上来说,JWT 就像是一种生成加密用户身份信息的 Token,更安全也更灵活。
三、整合步骤
第一步,给需要登录认证的模块添加 codingmore-security 依赖:
<dependency>
<groupId>top.codingmore</groupId>
<artifactId>codingmore-security</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
比如说 codingmore-admin 后端管理模块需要登录认证,就在 codingmore-admin/pom.xml 文件中添加 codingmore-security 依赖。
第二步,在需要登录认证的模块里添加 CodingmoreSecurityConfig 类,继承自 codingmore-security 模块中的 SecurityConfig 类。
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class CodingmoreSecurityConfig extends SecurityConfig {
@Autowired
private IUsersService usersService;
@Bean
public UserDetailsService userDetailsService() {
//获取登录用户信息
return username -> usersService.loadUserByUsername(username);
}
}
UserDetailsService 这个类主要是用来加载用户信息的,包括用户名、密码、权限、角色集合…其中有一个方法如下:
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
认证逻辑中,SpringSecurity 会调用这个方法根据客户端传入的用户名加载该用户的详细信息,包括判断:
- 密码是否一致
- 通过后获取权限和角色
public UserDetails loadUserByUsername(String username) {
// 根据用户名查询用户
Users admin = getAdminByUsername(username