SpringSecurity授權實現(xiàn)基本思路
一、授權基本思路
在SpringSecurity中,會使用默認的FilterSecurityInterceptor來進行權限校驗。在 FilterSecurityInterceptor中會從SecurityContextHolder獲取其中的Authentication,然后獲取其中的 權限信息。當前用戶是否擁有訪問當前資源所需的權限。
所以我們在項目中只需要把當前登錄用戶的權限信息也存入Authentication。然后設置我們的資源所需 要的權限即可
二、實現(xiàn)過程
(1)開啟相關配置
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig{
.....
}然后就可以使用對應的注解。@PreAuthorize在各接口
@RestController
public class HelloController {
@RequestMapping("/hello")
@PreAuthorize("hasAuthority('test')")
public String hello(){
return "hello";
}
}(2)自定義LoginUser,封裝權限信息
我們之前定義了UserDetails的實現(xiàn)類LoginUser,想要讓其能封裝權限信息就要對其進行修改。
@Data
@NoArgsConstructor
public class LoginUser implements UserDetails{
private User user;
//查詢到的權限列表
private List<String> list;
public LoginUser(User user, List<String> list) {
this.list = list;
this.user = user;
}
//自定義一個權限列表的集合 中轉操作
@JSONField(serialize = false)
List<SimpleGrantedAuthority> authorities;
//返回權限
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
if (authorities != null) {
return authorities;
}
authorities = new ArrayList<>();
for (String item : list) {
SimpleGrantedAuthority authority = new SimpleGrantedAuthority(item);
authorities.add(authority);
}
return authorities;
}
//獲取密碼
@Override
public String getPassword() {
return user.getPassword();
}
//獲取用戶名
@Override
public String getUsername() {
return user.getUserName();
}
//判斷賬號是否未過期
@Override
public boolean isAccountNonExpired() {
return true;
}
//判斷賬號是否沒有鎖定
@Override
public boolean isAccountNonLocked() {
return true;
}
//判斷賬號是否沒有超時
@Override
public boolean isCredentialsNonExpired() {
return true;
}
//判斷賬號是否可用
@Override
public boolean isEnabled() {
return true;
}
}(3)從數(shù)據(jù)庫查詢權限信息
RBAC模型
我們可以在UserDetailsServiceImpl中去調用該mapper的方法查詢權限信息封裝到LoginUser對象 中即可。
@Service
public class UserDetailServiceImpl implements UserDetailsService {
@Autowired
private UserMapper userMapper;
@Autowired
private MenuMapper menuMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//1.查詢用戶信息
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("user_name", username);
User user = userMapper.selectOne(queryWrapper);
//如果沒有查詢到用戶,就拋出異常
if (Objects.isNull(user)) {
throw new RuntimeException("用戶名或密碼錯誤");
}
//2.查詢用戶對應的權限信息
// List<String> list = new ArrayList<>();
// list.add("select");
// list.add("delete");
List<String> list = menuMapper.selectPermsByUserId(user.getId());
//3.返回UserDetails對象
return new LoginUser(user, list);
}
}到此這篇關于SpringSecurity授權實現(xiàn)的文章就介紹到這了,更多相關SpringSecurity授權內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Maven配置單倉庫與多倉庫的實現(xiàn)(Nexus)
本文主要介紹了Maven配置單倉庫與多倉庫的實現(xiàn)(Nexus),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-01-01
Spring實現(xiàn)源碼下載編譯及導入IDEA過程圖解
這篇文章主要介紹了Spring實現(xiàn)源碼下載編譯及導入IDEA,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-07-07
使用java.nio.file?庫優(yōu)雅的操作文件詳解
這篇文章主要介紹了使用java.nio.file?庫優(yōu)雅的操作文件詳解,需要的朋友可以參考下2023-05-05
springboot restTemplate連接池整合方式
這篇文章主要介紹了springboot restTemplate連接池整合方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10
教你安裝eclipse2021并配置內網maven中心倉庫的圖文詳解
本文能通過圖文并茂的形式給大家介紹安裝eclipse2021并配置內網maven中心倉庫的相關知識,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-09-09
Java Swing中的工具欄(JToolBar)和分割面版(JSplitPane)組件使用案例
這篇文章主要介紹了Java Swing中的工具欄(JToolBar)和分割面版(JSplitPane)組件使用案例,本文直接給出代碼實例和效果截圖,需要的朋友可以參考下2014-10-10

