欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringSecurity動態(tài)加載用戶角色權(quán)限實現(xiàn)登錄及鑒權(quán)功能

 更新時間:2019年11月27日 08:26:45   作者:字母哥博客  
這篇文章主要介紹了SpringSecurity動態(tài)加載用戶角色權(quán)限實現(xiàn)登錄及鑒權(quán)功能,很多朋友感覺這個功能很難,今天小編通過實例代碼給大家講解,需要的朋友可以參考下

很多人覺得Spring Security實現(xiàn)登錄驗證很難,我最開始學(xué)習(xí)的時候也這樣覺得。因為我好久都沒看懂我該怎么樣將自己寫的用于接收用戶名密碼的Controller與Spring Security結(jié)合使用,這是一個先入為主的誤區(qū)。后來我搞懂了:根本不用你自己去寫Controller。

你只需要告訴Spring Security用戶信息、角色信息、權(quán)限信息、登錄頁是什么?登陸成功頁是什么?或者其他有關(guān)登錄的一切信息。具體的登錄驗證邏輯它來幫你實現(xiàn)。

一、動態(tài)數(shù)據(jù)登錄驗證的基礎(chǔ)知識

在本號之前的文章中,已經(jīng)介紹了Spring Security的formLogin登錄認(rèn)證模式,RBAC的權(quán)限控制管理模型,并且針對Spring Security的登錄認(rèn)證邏輯源碼進(jìn)行了解析等等。我們所有的用戶、角色、權(quán)限信息都是在配置文件里面寫死的,然而在實際的業(yè)務(wù)系統(tǒng)中,這些信息通常是存放在RBAC權(quán)限模型的數(shù)據(jù)庫表中的。下面我們來回顧一下其中的核心概念:

  • RBAC的權(quán)限模型可以從用戶獲取為用戶分配的一個或多個角色,從用戶的角色又可以獲取該角色的多種權(quán)限。通過關(guān)聯(lián)查詢可以獲取某個用戶的角色信息和權(quán)限信息。
  • 在源碼解析的文章中,我們知道如果我們不希望用戶、角色、權(quán)限信息寫死在配置里面。我們應(yīng)該實現(xiàn)UserDetails與UserDetailsService接口,從而從數(shù)據(jù)庫或者其他的存儲上動態(tài)的加載這些信息。

以上是對一些核心的基礎(chǔ)知識的總結(jié),如果您對這些知識還不是很清晰,建議您先往下讀本文。如果看完本文仍然理解困難,建議您翻看本號之前的文章。

二、UserDetails與UserDetailsService接口

  • UserDetailsService接口有一個方法叫做loadUserByUsername,我們實現(xiàn)動態(tài)加載用戶、角色、權(quán)限信息就是通過實現(xiàn)該方法。函數(shù)見名知義:通過用戶名加載用戶。該方法的返回值就是UserDetails。
  • UserDetails就是用戶信息,即:用戶名、密碼、該用戶所具有的權(quán)限。

下面我們來看一下UserDetails接口都有哪些方法。

public interface UserDetails extends Serializable {
 //獲取用戶的權(quán)限集合
 Collection<? extends GrantedAuthority> getAuthorities();
 //獲取密碼
 String getPassword();
 //獲取用戶名
 String getUsername();
 //賬號是否沒過期
 boolean isAccountNonExpired();
 //賬號是否沒被鎖定
 boolean isAccountNonLocked();
 //密碼是否沒過期
 boolean isCredentialsNonExpired();
 //賬戶是否可用
 boolean isEnabled();
}

現(xiàn)在,我們明白了,只要我們把這些信息提供給Spring Security,Spring Security就知道怎么做登錄驗證了,根本不需要我們自己寫Controller實現(xiàn)登錄驗證邏輯。

三、實現(xiàn)UserDetails 接口

public class SysUser implements UserDetails{
 String password(); //密碼
 String username(); //用戶名
 boolean accountNonExpired; //是否沒過期
 boolean accountNonLocked; //是否沒被鎖定
 boolean credentialsNonExpired; //是否沒過期
 boolean enabled; //賬號是否可用
 Collection<? extends GrantedAuthority> authorities; //用戶的權(quán)限集合
 //省略構(gòu)造方法
 //省略set方法
 //省略get方法(即接口UserDetails的方法)
}

我們就是寫了一個適應(yīng)于UserDetails的java POJO類,所謂的 UserDetails接口實現(xiàn)就是一些get方法。get方法由Spring Security調(diào)用,我們通過set方法或構(gòu)造函數(shù)為 Spring Security提供UserDetails數(shù)據(jù)。

四、實現(xiàn)UserDetailsService接口

@Component
public class MyUserDetailsService implements UserDetailsService{
 @Override
 public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
  
 //這里從數(shù)據(jù)庫sys_user表里面查詢實體類對象。loadUser方法可使用Mybatis或JDBC或JPA自行實現(xiàn)。
 SysUser sysUser = loadUser(username); 
 // 判斷用戶是否存在 
 if(user == null) { throw new UsernameNotFoundException("用戶名不存在"); }
 //從數(shù)據(jù)庫該用戶所有的角色信息,所有的權(quán)限標(biāo)志
 //遍歷所有的ROLE角色及所有的Authority權(quán)限(菜單、按鈕)。
 //用逗號分隔他們的唯一標(biāo)志,具體過程自行實現(xiàn)。
 sysUser.setAuthorities(  AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_AMIN , system:user:delete")); 
 //sysUser.setAccountNonLocked(true或false);
 return sysUser;
 }
}
  • 通常數(shù)據(jù)庫表sys_user字段要和SysUser屬性一一對應(yīng),比如username、password、enabled。但是比如accountNonLocked字段用于登錄多次錯誤鎖定,但我們一般不會在表里存是否鎖定,而是存一個鎖定時間字段。通過鎖定時間是否大于當(dāng)前時間判斷賬號是否鎖定,所以實現(xiàn)過程中可以靈活做判斷并用好set方法,不必拘泥于一一對應(yīng)的形式。
  • 角色是一種特殊的權(quán)限,在Spring Security我們可以使用hasRole(角色標(biāo)識)表達(dá)式判斷用戶是否具有某個角色,決定他是否可以做某個操作;通過hasAuthority(權(quán)限標(biāo)識)表達(dá)式判斷是否具有某個操作權(quán)限。

五、最后說明

至此,我們將系統(tǒng)里面的所有的用戶、角色、權(quán)限信息都通過UserDetailsService和UserDetails告知了Spring Security。但是多數(shù)朋友可能仍然不知道該怎樣實現(xiàn)登錄的功能,其實剩下的事情很簡單了:

  • 寫一個登錄界面,寫一個登錄表單,表單使用post方法提交到默認(rèn)的/login路徑
  • 表單的用戶名、密碼字段名稱默認(rèn)是username、password。
  • 寫一個登錄成功之后的跳轉(zhuǎn)頁面,比如index.html

然后把這些信息通過配置方式告知Spring Security ,以上的配置信息名稱都可以靈活修改。如果您不知道如何配置請參考本號之前的文章《formLogin登錄認(rèn)證模式》。

總結(jié)

以上所述是小編給大家介紹的SpringSecurity動態(tài)加載用戶角色權(quán)限實現(xiàn)登錄及鑒權(quán)功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

相關(guān)文章

  • Java輕松實現(xiàn)表單提交的三種方法

    Java輕松實現(xiàn)表單提交的三種方法

    在Web開發(fā)中,表單是用戶與網(wǎng)站交互的主要方式之一,本文將詳細(xì)介紹如何在Java中實現(xiàn)表單提交,并通過代碼和案例為新手朋友提供詳細(xì)的指導(dǎo),有需要的可以參考下
    2024-10-10
  • 在Java中實現(xiàn)堆排序的步驟詳解

    在Java中實現(xiàn)堆排序的步驟詳解

    堆排序是一種基于堆數(shù)據(jù)結(jié)構(gòu)的排序算法,堆是一種特殊的完全二叉樹,堆排序利用堆的性質(zhì)通過一系列操作將數(shù)組元素按升序或降序排列,本文給大家介紹了如何在Java中實現(xiàn)堆排序,需要的朋友可以參考下
    2024-12-12
  • springboot 如何使用jedis連接Redis數(shù)據(jù)庫

    springboot 如何使用jedis連接Redis數(shù)據(jù)庫

    這篇文章主要介紹了springboot 使用jedis連接Redis數(shù)據(jù)庫的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Springboot jar包遠(yuǎn)程調(diào)試詳解

    Springboot jar包遠(yuǎn)程調(diào)試詳解

    這篇文章主要為大家詳細(xì)介紹了Springboot jar包遠(yuǎn)程調(diào)試,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • Java里的static import使用小結(jié)

    Java里的static import使用小結(jié)

    這篇文章主要介紹了Java里的static import使用小結(jié),本文給出了一些使用示例,并總結(jié)了一些使用特性,需要的朋友可以參考下
    2015-06-06
  • Jmeter?BeanShell?內(nèi)置變量vars、props、prev的使用詳解

    Jmeter?BeanShell?內(nèi)置變量vars、props、prev的使用詳解

    這篇文章主要介紹了Jmeter?BeanShell?內(nèi)置變量vars、props、prev的使用?,文中給大家介紹了Jmeter中關(guān)于BeanShell的相關(guān)知識,結(jié)合實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • Java中的Object類詳細(xì)介紹

    Java中的Object類詳細(xì)介紹

    這篇文章主要介紹了Java中的Object類詳細(xì)介紹,本文講解了Object類的作用、Object類的主要方法、Object類中不能被重寫的方法、Object類的equals方法重寫實例等內(nèi)容,需要的朋友可以參考下
    2015-06-06
  • Java Mybatis框架多表操作與注解開發(fā)詳解分析

    Java Mybatis框架多表操作與注解開發(fā)詳解分析

    MyBatis 是一款優(yōu)秀的持久層框架,它支持自定義 SQL、存儲過程以及高級映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作。MyBatis 可以通過簡單的 XML 或注解來配置和映射原始類型、接口和 Java POJO為數(shù)據(jù)庫中的記錄
    2021-10-10
  • 徹底搞定堆排序:二叉堆

    徹底搞定堆排序:二叉堆

    二叉堆有兩種:最大堆和最小堆。最大堆:父結(jié)點(diǎn)的鍵值總是大于或等于任何一個子節(jié)點(diǎn)的鍵值;最小堆:父結(jié)點(diǎn)的鍵值總是小于或等于任何一個子節(jié)點(diǎn)的鍵值
    2021-07-07
  • Java集合去重導(dǎo)致的線上問題

    Java集合去重導(dǎo)致的線上問題

    這篇文章主要介紹了Java集合去重導(dǎo)致的線上問題,根據(jù)主題提出Set是怎樣保證數(shù)據(jù)的唯一性的,為什么兩種去重方式性能差距這么大的問題,下文解決思路需要的小伙伴可以參考一下
    2022-04-04

最新評論