<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] ## 1. 基于url攔截-用戶認證實現 ![](https://box.kancloud.cn/44c04c006c8288c57a15f718ed6c6d31_577x532.png) 藍色為用戶認證,綠色為權限管理 ### 1.1 用戶認證 > * ShiroConfiguration.java:shiro啟動時候的初始化工作,比如哪些是需要認證,哪些不需要認證;緩存配置設置;shiro權限數據在頁面展示時整合需要的模板套件配置,等等。 > * ShiroRealm.java:shiro權限認證的具體實現代碼,因為shiro本身只提供攔截路由,而具體如何數據源則由用戶自己提供,不同的項目不同的要求,要不要加緩存登陸驗證次數,要不要密碼加密設置其他具體方式,這些都由用戶自己決定,而shiro只提供給用戶權限驗證的格式接口,通過用戶提供的數據源shrio判斷要不要給具體用戶授權請求路徑的判斷。 > * ShiroRealm 涉及到以下點: > * principal:主體,就是登陸的當前用戶類型的數據實體 > * credentials:憑證,用戶的密碼,具體加密方式用戶自己實現,什么都不做就是原文 > * Roles:用戶擁有的角色標識(角色名稱,admin,account,customer_service),字符串格式列表:用戶擁有多個角色的可能 > * Permissions:用戶擁有的權限標識(每個權限唯一標識,比如主鍵或者權限唯一標識編碼),字符串格式列表:用戶擁有多個權限的可能 **身份認證** > 在認證、授權內部實現機制中都有提到,最終處理都將交給Real進行處理。因為在Shiro中,最終是通過Realm來獲取應用程序中的用戶、角色及權限信息的。通常情況下,在Realm中會直接從我們的數據源中獲取Shiro需要的驗證信息。可以說,Realm是專用于安全框架的DAO. **認證實現** > Shiro的認證過程最終會交由Realm執行,這時會調用Realm的getAuthenticationInfo(token)方法。 > 該方法主要執行以下操作: > 1、檢查提交的進行認證的令牌信息 > 2、根據令牌信息從數據源(通常為數據庫)中獲取用戶信息 > 3、對用戶信息進行匹配驗證。 > 4、驗證通過將返回一個封裝了用戶信息的AuthenticationInfo實例。 > 5、驗證失敗則拋出AuthenticationException異常信息。 而在我們的應用程序中要做的就是自定義一個Realm類,繼承AuthorizingRealm抽象類,重載doGetAuthenticationInfo (),重寫獲取用戶信息的方法。 在權限管理系統中,有這么幾個角色很重要,這個要是不清楚的話,那么就很難理解,我們為什么這么編碼了。 >用戶表: >在用戶表中保存了用戶的基本信息,賬號、密碼、姓名,性別等; > 權限表: > (資源+控制權限)這個表中主要是保存了用戶的URL地址,權限信息; > 角色表: > 在這個表重要保存了系統存在的角色; > 關聯表: > 用戶-角色管理表(用戶在系統中都有什么角色,比如admin,vip等), > 角色-權限關聯表(每個角色都有什么權限可以進行操作)。 ~~~ /** * Created by hanxt on 17-12-18. * 獲取用戶的角色和權限信息 */ @Component("aexitShrioRealm") public class AexitShrioRealm extends AuthorizingRealm { @Resource UserService userService; @Resource RoleService roleService; @Resource MenuService menuService; /** * 配置登錄認證信息 * * @param authenticationToken * @return * @throws AuthenticationException */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken; String userId = token.getUsername(); if (userId == null) { throw new AccountException("Null usernames are not allowed by this realm."); } //查出是否有此用戶 SysUser curUser = userService.getByUserId(userId); if(curUser == null) throw new AccountException("account error:one user name must have one and only one user! "); //密碼加密 String password = ShiroKit.md5(curUser.getPassword(),curUser.getSalt()); return new SimpleAuthenticationInfo(userId, password, getName()); } } ~~~ ### 1.2 權限控制 > 至于doGetAuthorizationInfo()是權限控制,當訪問到頁面的時候,使用了相應的注解或者shiro標簽才會執行此方法否則不會執行,所以如果只是簡單的身份認證沒有權限的控制的話,那么這個方法可以不進行實現,直接返回null即可。 > 向shiro返回用戶及用戶擁有權限信息SimpleAuthorizationInfo,在使用shiro注解或者標簽后,調用至于doGetAuthorizationInfo獲取權限信息,并且對于用戶要訪問的URL與這個用戶的權限匹配 #### 權限控制流程 1. 注解或者標簽觸發權限驗證 2. doGetAuthorizationInfo()獲取當前用戶的角色和權限 3. 用數據庫中的權限與訪問的URL對比,有此權限訪問通過,沒有拒絕 我們在進行權限驗證的時候,我們只需要重寫oGetAuthorizationInfo()方法,獲取當前用戶的權限,其他的權限驗證都是有shiro框架做 ~~~ 進行角色的添加和權限的添加。 authorizationInfo.addRole(role.getRole()); authorizationInfo.addStringPermission(p.getPermission()); ~~~ ~~~ /** * 配置用戶權限 */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { if (principals == null) { throw new AuthorizationException("PrincipalCollection method argument cannot be null."); } String userId = (String) getAvailablePrincipal(principals); List<String> roleList = roleService.getRoleIdsByUserId(userId); //用戶角色獲取用戶功能id Set<String> roleSet = new HashSet<>(); //角色集合 Set<String> menuSet = new HashSet<>(); //菜單集合 List<String> menus; for(String roleId : roleList){ roleSet.add(roleId); menus = menuService.getMenuidsByRoleId(roleId); Collections.addAll(menuSet,menus.toArray(new String[menus.size()])); } SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(roleSet); authorizationInfo.setStringPermissions(menuSet); return authorizationInfo; } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看