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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Shiro身份认证授权原理

發布時間:2023/12/10 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Shiro身份认证授权原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

shiro在應用程序中的使用是用Subject為入口的, 最終subject委托給真正的管理者ShiroSecurityMannager

Realm是Shiro獲得身份認證信息和來源信息的地方(所以這里是我們實現的)我們只要繼承他的實現類重寫方法就好了,AuthorizingRealm?

身份認證過程

自定義realm代碼

public class myRealm extends AuthorizingRealm {//realm的名稱@Overridepublic String getName() {// TODO Auto-generated method stubreturn "myRealm";}//驗證token是否是有效的token@Overridepublic boolean supports(AuthenticationToken arg0) {// TODO Auto-generated method stubreturn arg0 instanceof UsernamePasswordToken;}//授權獲得用戶權限信息的方法@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();info.addRole("321");info.addRole("3332");info.addStringPermission("333");info.addStringPermission("555");info.addObjectPermission(new WildcardPermission("44"));// TODO Auto-generated method stubreturn info;}//認證獲取用戶身份信息的方法@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {UsernamePasswordToken loginToken=(UsernamePasswordToken)token;String password=new String(loginToken.getPassword());System.out.println(password);System.out.println(loginToken.getUsername());if(loginToken.getUsername()=="zhang"&&password.equals("123")){}else{throw new IncorrectCredentialsException();}// TODO Auto-generated method stubSimpleAuthenticationInfo info= new SimpleAuthenticationInfo(loginToken.getUsername(),password,getName());return info;}}

  

doGetAuthorizationInfo方法是進行用戶授權的時候調用的方法 用戶獲得當前用戶的授權信息 先不管他
doGetAuthenticationInfo是當我們調用subject.login進行認證的方法 這個方法的參數token就是我們subject.login調用的
這里面我們就可以查詢數據庫對用戶名和密碼進行認證
如果認證成功將用戶信息封裝成SimpleAuthenticationInfo
認證失敗根據幾種情況拋出異常,常見的如:
DisabledAccountException(禁用的帳號)、LockedAccountException(鎖定的帳號)
UnknownAccountException(錯誤的帳號)
ExcessiveAttemptsException(登錄失敗次數過多)、IncorrectCredentialsException (錯誤的憑證)
ExpiredCredentialsException(過期的憑證)等

shiro.ini配置

#聲明一個realm myRealm1=com.liqiang.realm.myRealm #這里就是我們注入realm的地方 securityManager.realms=$myRealm1

?

實現身份認證的代碼

@Test public void testHelloworld() { //1、獲取SecurityManager工廠,此處使用Ini配置文件初始化SecurityManager Factory<org.apache.shiro.mgt.SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini"); //2、得到SecurityManager實例 并綁定給SecurityUtils org.apache.shiro.mgt.SecurityManager securityManager = factory.getInstance(); SecurityUtils.setSecurityManager(securityManager); //3、得到Subject及創建用戶名/密碼身份驗證Token(即用戶身份/憑證) Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123"); try { //4、登錄,即身份驗證 subject.login(token); } catch (AuthenticationException e) { //5、身份驗證失敗 } subject.logout(); }

上面我們調用sbuject.login(token) 這個token封裝了前端用戶輸入的用戶名和密碼

?

授權驗證

?當我們通過subject.isPermitted("user:update") 當我們判斷當前用戶是否擁有user:update這個權限代碼的時候

會調用我們ream的?doGetAuthorizationInfo 方法獲得授權信息。我們在這里面就是根據用戶信息查詢數據將認證信息封裝

SimpleAuthorizationInfo 返回回去

//授權獲得用戶權限信息的方法 @Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();info.addRole("321");info.addRole("3332");info.addStringPermission("333");info.addStringPermission("555");info.addObjectPermission(new WildcardPermission("44"));// TODO Auto-generated method stubreturn info;}

這里通過查詢數據庫知道用戶有321 ?332 ?這2個角色 和?333 ??555 ??44 ?這幾個權限

WildcardPermission 這個又是什么意思呢。。通過addStringPermission 默認是用Permission的實現類封裝的 如果我們又定義就用我們的封裝 沒有定義就用默認的WildcardPermission
最終將他們保存到一個集合里面
如: public class MyPermission implements Permission {String permissionCode;public MyPermission(String name) {permissionCode=name;}@Overridepublic boolean implies(Permission permission) {//自定義比較// TODO Auto-generated method stubreturn false;}}

當我們調用subject.isPermitted("user:update")會調用將指令傳達給

SecurityManager SecurityManager 再將指令傳達給授權管理類Authorizer Authorizer會通過reaml獲得授權信息SimpleAuthorizationInfo
如果我們返回的授權信息擁有角色 會調用RolePermissionResolver實現類的方法 將角色的權限追加到SimpleAuthorizationInfo(默認是沒有實現的)
如: public class MyRolePermissionResolver implements RolePermissionResolver{@Overridepublic Collection<Permission> resolvePermissionsInRole(String roleString) {// TODO Auto-generated method stubreturn Arrays.asList((Permission)new MyPermission("menu:*")); }

這里面應該是根據角色查詢權限?

最終 遍歷SimpleAuthorizationInfo的權限信息 (我們的權限信息都封裝Permission接口實現類 調用implies方法進行比較 如果比較成功返回true 表示授權通過)自定義Permission的好處就是我們可以自定義匹配規則

注入自定義Permission和RolePerminssion的配置

[main] authorizer=org.apache.shiro.authz.ModularRealmAuthorizer securityManager.authorizer=$authorizer #自定義rolePermissionResolver rolePermissionResolver=com.liqiang.permissionResolver.MyRolePermissionResolver authorizer.rolePermissionResolver=$rolePermissionResolver securityManager.authorizer=$authorizer permissionResolver=com.liqiang.permissionResolver.MyPermissionResolver authorizer.permissionResolver=$permissionResolver #聲明一個realm myRealm1=com.liqiang.realm.myRealm #指定securityManager的realms實現 securityManager.realms=$myRealm1

?PS:好記性不如爛筆頭 ?希望自己回頭來看一下就能回憶起來

? ? ? ? 學習文章:http://jinnianshilongnian.iteye.com/blog/2018398

轉載于:https://www.cnblogs.com/LQBlog/p/7256777.html

總結

以上是生活随笔為你收集整理的Shiro身份认证授权原理的全部內容,希望文章能夠幫你解決所遇到的問題。

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