SpringSecurity授權(quán)實(shí)現(xiàn)基本思路
一、授權(quán)基本思路
在SpringSecurity中,會使用默認(rèn)的FilterSecurityInterceptor來進(jìn)行權(quán)限校驗(yàn)。在 FilterSecurityInterceptor中會從SecurityContextHolder獲取其中的Authentication,然后獲取其中的 權(quán)限信息。當(dāng)前用戶是否擁有訪問當(dāng)前資源所需的權(quán)限。
所以我們在項(xiàng)目中只需要把當(dāng)前登錄用戶的權(quán)限信息也存入Authentication。然后設(shè)置我們的資源所需 要的權(quán)限即可
二、實(shí)現(xiàn)過程
(1)開啟相關(guān)配置
@EnableGlobalMethodSecurity(prePostEnabled = true) public class SecurityConfig{ ..... }
然后就可以使用對應(yīng)的注解。@PreAuthorize在各接口
@RestController public class HelloController { @RequestMapping("/hello") @PreAuthorize("hasAuthority('test')") public String hello(){ return "hello"; } }
(2)自定義LoginUser,封裝權(quán)限信息
我們之前定義了UserDetails的實(shí)現(xiàn)類LoginUser,想要讓其能封裝權(quán)限信息就要對其進(jìn)行修改。
@Data @NoArgsConstructor public class LoginUser implements UserDetails{ private User user; //查詢到的權(quán)限列表 private List<String> list; public LoginUser(User user, List<String> list) { this.list = list; this.user = user; } //自定義一個(gè)權(quán)限列表的集合 中轉(zhuǎn)操作 @JSONField(serialize = false) List<SimpleGrantedAuthority> authorities; //返回權(quán)限 @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; } //判斷賬號是否沒有超時(shí) @Override public boolean isCredentialsNonExpired() { return true; } //判斷賬號是否可用 @Override public boolean isEnabled() { return true; } }
(3)從數(shù)據(jù)庫查詢權(quán)限信息
RBAC模型
我們可以在UserDetailsServiceImpl中去調(diào)用該mapper的方法查詢權(quán)限信息封裝到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("用戶名或密碼錯(cuò)誤"); } //2.查詢用戶對應(yīng)的權(quán)限信息 // 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); } }
到此這篇關(guān)于SpringSecurity授權(quán)實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SpringSecurity授權(quán)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Maven配置單倉庫與多倉庫的實(shí)現(xiàn)(Nexus)
本文主要介紹了Maven配置單倉庫與多倉庫的實(shí)現(xiàn)(Nexus),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01Spring實(shí)現(xiàn)源碼下載編譯及導(dǎo)入IDEA過程圖解
這篇文章主要介紹了Spring實(shí)現(xiàn)源碼下載編譯及導(dǎo)入IDEA,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07如何把spring boot項(xiàng)目部署到tomcat容器中
本文給大家分享如何把spring boot項(xiàng)目部署到tomcat容器中,本文給大家介紹的非常詳細(xì),需要的朋友參考下2017-04-04Java中連接Mongodb進(jìn)行增刪改查的操作詳解
MongoDB是一個(gè)基于分布式文件存儲的數(shù)據(jù)庫,由C++語言編寫,旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲解決方案,本文給大家介紹了Java中連接Mongodb進(jìn)行操作,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2024-06-06使用java.nio.file?庫優(yōu)雅的操作文件詳解
這篇文章主要介紹了使用java.nio.file?庫優(yōu)雅的操作文件詳解,需要的朋友可以參考下2023-05-05springboot restTemplate連接池整合方式
這篇文章主要介紹了springboot restTemplate連接池整合方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10教你安裝eclipse2021并配置內(nèi)網(wǎng)maven中心倉庫的圖文詳解
本文能通過圖文并茂的形式給大家介紹安裝eclipse2021并配置內(nèi)網(wǎng)maven中心倉庫的相關(guān)知識,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-09-09Java Swing中的工具欄(JToolBar)和分割面版(JSplitPane)組件使用案例
這篇文章主要介紹了Java Swing中的工具欄(JToolBar)和分割面版(JSplitPane)組件使用案例,本文直接給出代碼實(shí)例和效果截圖,需要的朋友可以參考下2014-10-10