回顧
《引入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配置,就大功告成了