日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

shrio初体验(2)Realm

發布時間:2025/6/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 shrio初体验(2)Realm 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Realm:域,Shiro從從Realm獲取安全數據(如用戶、角色、權限),就是說SecurityManager要驗證用戶身份,那么它需要從Realm獲取相應的用戶進行比較以確定用戶身份是否合法;也需要從Realm得到用戶相應的角色/權限進行驗證用戶是否能進行操作;可以把Realm看成DataSource,即安全數據源。如我們之前的ini配置方式將使用org.apache.shiro.realm.text.IniRealm。

?

org.apache.shiro.realm.Realm接口如下:?

Java代碼??
  • String?getName();?//返回一個唯一的Realm名字??
  • boolean?supports(AuthenticationToken?token);?//判斷此Realm是否支持此Token??
  • AuthenticationInfo?getAuthenticationInfo(AuthenticationToken?token)??
  • ?throws?AuthenticationException;??//根據Token獲取認證信息??
  • ?

    Realm配置

    1、自定義Realm實現(com.github.zhangkaitao.shiro.chapter2.realm.MyRealm1):??

    Java代碼??
  • public?class?MyRealm1?implements?Realm?{??
  • ????@Override??
  • ????public?String?getName()?{??
  • ????????return?"myrealm1";??
  • ????}??
  • ????@Override??
  • ????public?boolean?supports(AuthenticationToken?token)?{??
  • ????????//僅支持UsernamePasswordToken類型的Token??
  • ????????return?token?instanceof?UsernamePasswordToken;???
  • ????}??
  • ????@Override??
  • ????public?AuthenticationInfo?getAuthenticationInfo(AuthenticationToken?token)?throws?AuthenticationException?{??
  • ????????String?username?=?(String)token.getPrincipal();??//得到用戶名??
  • ????????String?password?=?new?String((char[])token.getCredentials());?//得到密碼??
  • ????????if(!"zhang".equals(username))?{??
  • ????????????throw?new?UnknownAccountException();?//如果用戶名錯誤??
  • ????????}??
  • ????????if(!"123".equals(password))?{??
  • ????????????throw?new?IncorrectCredentialsException();?//如果密碼錯誤??
  • ????????}??
  • ????????//如果身份認證驗證成功,返回一個AuthenticationInfo實現;??
  • ????????return?new?SimpleAuthenticationInfo(username,?password,?getName());??
  • ????}??
  • }???
  • ?

    2、ini配置文件指定自定義Realm實現(shiro-realm.ini)??

    Java代碼??
  • #聲明一個realm??
  • myRealm1=com.github.zhangkaitao.shiro.chapter2.realm.MyRealm1??
  • #指定securityManager的realms實現??
  • securityManager.realms=$myRealm1???
  • 通過$name來引入之前的realm定義

    ?

    3、測試用例請參考com.github.zhangkaitao.shiro.chapter2.LoginLogoutTest的testCustomRealm測試方法,只需要把之前的shiro.ini配置文件改成shiro-realm.ini即可。

    ?

    Realm配置

    1、ini配置文件(shiro-multi-realm.ini)??

    Java代碼??
  • #聲明一個realm??
  • myRealm1=com.github.zhangkaitao.shiro.chapter2.realm.MyRealm1??
  • myRealm2=com.github.zhangkaitao.shiro.chapter2.realm.MyRealm2??
  • #指定securityManager的realms實現??
  • securityManager.realms=$myRealm1,$myRealm2???
  • securityManager會按照realms指定的順序進行身份認證。此處我們使用顯示指定順序的方式指定了Realm的順序,如果刪除“securityManager.realms=$myRealm1,$myRealm2”,那么securityManager會按照realm聲明的順序進行使用(即無需設置realms屬性,其會自動發現),當我們顯示指定realm后,其他沒有指定realm將被忽略,如“securityManager.realms=$myRealm1”,那么myRealm2不會被自動設置進去。

    ?

    2、測試用例請參考com.github.zhangkaitao.shiro.chapter2.LoginLogoutTest的testCustomMultiRealm測試方法。

    ?

    Shiro默認提供的Realm

    ?

    ?

    以后一般繼承AuthorizingRealm(授權)即可;其繼承了AuthenticatingRealm(即身份驗證),而且也間接繼承了CachingRealm(帶有緩存實現)。其中主要默認實現如下:

    org.apache.shiro.realm.text.IniRealm[users]部分指定用戶名/密碼及其角色;[roles]部分指定角色即權限信息;

    org.apache.shiro.realm.text.PropertiesRealm?user.username=password,role1,role2指定用戶名/密碼及其角色;role.role1=permission1,permission2指定角色及權限信息;

    org.apache.shiro.realm.jdbc.JdbcRealm通過sql查詢相應的信息,如“select password from users where username = ?”獲取用戶密碼,“select password, password_salt from users where username = ?”獲取用戶密碼及鹽;“select role_name from user_roles where username = ?”獲取用戶角色;“select permission from roles_permissions where role_name = ?”獲取角色對應的權限信息;也可以調用相應的api進行自定義sql;

    ?

    JDBC Realm使用

    1、數據庫及依賴

    Java代碼??
  • <dependency>??
  • ????<groupId>mysql</groupId>??
  • ????<artifactId>mysql-connector-java</artifactId>??
  • ????<version>5.1.25</version>??
  • </dependency>??
  • <dependency>??
  • ????<groupId>com.alibaba</groupId>??
  • ????<artifactId>druid</artifactId>??
  • ????<version>0.2.23</version>??
  • </dependency>???
  • 本文將使用mysql數據庫及druid連接池;?

    ?

    2、到數據庫shiro下建三張表:users(用戶名/密碼)、user_roles(用戶/角色)、roles_permissions(角色/權限),具體請參照shiro-example-chapter2/sql/shiro.sql;并添加一個用戶記錄,用戶名/密碼為zhang/123;

    ?

    3、ini配置(shiro-jdbc-realm.ini)?

    Java代碼??
  • jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm??
  • dataSource=com.alibaba.druid.pool.DruidDataSource??
  • dataSource.driverClassName=com.mysql.jdbc.Driver??
  • dataSource.url=jdbc:mysql://localhost:3306/shiro??
  • dataSource.username=root??
  • #dataSource.password=??
  • jdbcRealm.dataSource=$dataSource??
  • securityManager.realms=$jdbcRealm???
  • 1、變量名=全限定類名會自動創建一個類實例

    2、變量名.屬性=值?自動調用相應的setter方法進行賦值

    3、$變量名?引用之前的一個對象實例?

    4、測試代碼請參照com.github.zhangkaitao.shiro.chapter2.LoginLogoutTest的testJDBCRealm方法,和之前的沒什么區別。

    轉載于:https://www.cnblogs.com/LvLoveYuForever/p/6207998.html

    總結

    以上是生活随笔為你收集整理的shrio初体验(2)Realm的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。