回顾
《引入Security遇到的问题》前文基本引入seciruy,就准备弄登录和注册模块了
这里有个问题,很久之前,我也打算吧seciruy当成一个模块来弄,不过具体怎么去弄,有点不清醒,之前的老项目jfun、或者jfun-cloud应该会有类似的问题
现在的处理方法
现在的处理方法在下图模块的基础之上
mall-security
component
|--------------JwtAuthenticationTokenFilter JWT登录授权过滤器
|--------------RestAuthenticationEntryPoint 自定义返回结果:未登录或登录过期
|--------------RestfulAccessDeniedHandler 自定义返回结果:没有权限访问时
config
|--------------IgnoreUrlsConfig用于配置不需要保护的资源路径 如Swagger
|—-------------SecurityConfig 对SpringSecurity的配置的扩展,支持自定义白名单资源路径和查询用户逻辑
util
|--------------JwtTokenUtil JwtToken生成的工具类
- 主项目基础seciruy配置类
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled=true)
public class MallSecurityConfig extends SecurityConfig {
@Autowired
private IUmsAdminService adminService;
@Bean
public UserDetailsService userDetailsService() {
//获取登录用户信息
return username -> adminService.loadUserByUsername(username);
}
}
- 建立一个服务类
public interface IUmsAdminService extends IService<UmsAdmin> {
UmsAdmin register(UmsAdmin umsAdminParam);
List<UmsPermission> getPermissionList(Long adminId);
String login(String username, String password);
UserDetails loadUserByUsername(String username);
/**
* 根据用户名获取后台管理员
*/
UmsAdmin getAdminByUsername(String username);
}
该方法需要用到loadUserByUsername
public class AdminUserDetails implements UserDetails {
private UmsAdmin umsAdmin;
private List<UmsPermission> permissionList;
public AdminUserDetails(UmsAdmin umsAdmin, List<UmsPermission> permissionList) {
this.umsAdmin = umsAdmin;
this.permissionList = permissionList;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
//返回当前用户的权限
return permissionList.stream()
.filter(permission -> permission.getValue()!=null)
.map(permission ->new SimpleGrantedAuthority(permission.getValue()))
.collect(Collectors.toList());
}
@Override
public String getPassword() {
return umsAdmin.getPassword();
}
@Override
public String getUsername() {
return umsAdmin.getUsername();
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return umsAdmin.getStatus().equals(1);
}
}
- 注意问题
⚠️ 注意swagger的URL配置,就大功告成了