• <tfoot id="ukgsw"><input id="ukgsw"></input></tfoot>
    
    • 久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
      分享

      jfinal-shiro的shiro注解結合數據庫url路徑過濾,動態維護你的權限系統,支持ajax

       飛鷹飛龍飛天 2014-11-19

      https://github.com/Dreampie/jfinal-shiro  的jfinal-shiro插件:

      1
      2
      3
      4
      5
      <dependency>
            <groupId>cn.dreampie</groupId>
            <artifactId>jfinal-shiro</artifactId>
            <version>${jfinal-shiro.version}</version>
       </dependency>

      目前剛剛發布第一個版本0.1:

      1
      <jfinal-shiro.version>0.1</jfinal-shiro.version>

      首先感謝jfinal-ext中原作者,該插件主要是針對ext插件的部分改進。

      下面主要介紹兩種使用方式:

          在web.xml里添加

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
          <!--權限過濾器 start-->
          <listener>
              <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
          </listener>
           
          <filter>
              <filter-name>shiroFilter</filter-name>
              <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
          </filter>
          <filter-mapping>
              <filter-name>shiroFilter</filter-name>
              <url-pattern>/*</url-pattern>
              <dispatcher>REQUEST</dispatcher>
              <dispatcher>FORWARD</dispatcher>
              <dispatcher>INCLUDE</dispatcher>
              <dispatcher>ERROR</dispatcher>
          </filter-mapping>
          <!--權限過濾器 end-->

          啟用shiro   在jfinal config里configPlugin方法添加

      1
      2
      3
        
       //shiro權限框架   在jfinal  plugins里添加shiro  plugin
              plugins.add(new ShiroPlugin(routes, new MyJdbcAuthzService()));

          添加shiro的過濾器  在jfinal config里configInterceptor方法添加

      1
      2
      3
      interceptors.add(new ShiroInterceptor());
      public class User extends cn.dreampie.shiro.model.User<User> //user的model需要繼承User
      1. 在方法上使用注解

        1. Shiro共有5個注解,分別如下:

          1. RequiresAuthentication:使用該注解標注的類,實例,方法在訪問或調用時,當前Subject必須在當前session中已經過認證。

          2. RequiresGuest:使用該注解標注的類,實例,方法在訪問或調用時,當前Subject可以是“gust”身份,不需要經過認證或者在原先的session中存在記錄。

          3. RequiresPermissions:當前Subject需要擁有某些特定的權限時,才能執行被該注解標注的方法。如果當前Subject不具有這樣的權限,則方法不會被執行。

          4. RequiresRoles:當前Subject必須擁有所有指定的角色時,才能訪問被該注解標注的方法。如果當天Subject不同時擁有所有指定角色,則方法不會執行還會拋出AuthorizationException異常。

          5. RequiresUser:當前Subject必須是應用的用戶,才能訪問或調用被該注解標注的類,實例,方法。

        2. Shiro的認證注解處理是有內定的處理順序的,如果有個多個注解的話,前面的通過了會繼續檢查后面的,若不通過則直接返回,處理順序依次為(與實際聲明順序無關):
          RequiresRoles
          RequiresPermissions
          RequiresAuthentication
          RequiresUser
          RequiresGuest
          例如:你同時生命了RequiresRoles和RequiresPermissions,那就要求擁有此角色的同時還得擁有相應的權限。

        3. RequiresRoles可以用在Controller或者方法上。可以多個roles,默認邏輯為 AND也就是所有具備所有role才能訪問。

                示例:

        1
        2
        3
        4
        5
        6
        7
        8
        //屬于user角色
        @RequiresRoles("user")
          
        //必須同時屬于user和admin角色
        @RequiresRoles({"user","admin"})
          
        //屬于user或者admin之一。
        @RequiresRoles(value={"user","admin"},logical=Logical.OR)
      2. 其他使用方法類似。

      3. 1
        2
        3
        4
        @RequiresPermissions
        @RequiresAuthentication
        @RequiresUser
        @RequiresGusst
      4. 詳細可以參考瑪雅牛的shiro注解使用,http://my.oschina.net/myaniu/blog/137205

      5. 基于數據庫的權限設計與維護

        數據庫的基本權限結構主要:用戶->角色->權限

        表結構設計如下(h2數據庫,使用其他數據修改部分sql語句之后使用):

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        43
        44
        45
        46
        47
        48
        49
        50
        51
        52
        53
        54
        55
        56
        57
        58
        59
        60
        61
        62
        63
        64
        65
        66
        67
        68
        69
        70
        71
        72
        73
        74
        75
        76
        77
        78
        79
        80
        81
        82
        83
        84
        85
        86
        87
        88
        89
        90
        91
        DROP TABLE IF EXISTS sec_user;
        DROP SEQUENCE IF EXISTS sec_user_id_seq;
        CREATE SEQUENCE sec_user_id_seq START WITH 1;
        CREATE TABLE sec_user (  --用戶表
          id            BIGINT       NOT NULL DEFAULT NEXTVAL('sec_user_id_seq'PRIMARY KEY,
          username      VARCHAR(50)  NOT NULL COMMENT '登錄名',
          providername  VARCHAR(50)  NOT NULL COMMENT '提供者',
          email         VARCHAR(200) COMMENT '郵箱',
          mobile        VARCHAR(50) COMMENT '手機',
          password      VARCHAR(200) NOT NULL COMMENT '密碼',
          hasher   VARCHAR(200) NOT NULL COMMENT '加密類型',
          salt VARCHAR(200) NOT NULL COMMENT '加密鹽',
          avatar_url    VARCHAR(255) COMMENT '頭像',
          first_name    VARCHAR(10) COMMENT '名字',
          last_name     VARCHAR(10) COMMENT '姓氏',
          full_name     VARCHAR(20) COMMENT '全名',
          department_id BIGINT NOT NULL COMMENT '部門id',
          created_at    TIMESTAMP    NOT NULL,
          updated_at    TIMESTAMP,
          deleted_at    TIMESTAMP
        );
        DROP TABLE IF EXISTS sec_user_info;
        DROP SEQUENCE IF EXISTS sec_user_info_id_seq;
        CREATE SEQUENCE sec_user_info_id_seq START WITH 1;
        CREATE TABLE sec_user_info (-- 用戶詳細信息表
          id          BIGINT    NOT NULL DEFAULT NEXTVAL('sec_user_info_id_seq'PRIMARY KEY,
          user_id     BIGINT    NOT NULL COMMENT '用戶id',
          creator_id  BIGINT COMMENT '創建者id',
          gender      INT DEFAULT 0 COMMENT '性別0男,1女',
          province_id BIGINT COMMENT '省id',
          city_id     BIGINT COMMENT '市id',
          county_id   BIGINT COMMENT '縣id',
          street      VARCHAR(500) COMMENT '街道',
          zip_code    VARCHAR(50) COMMENT '郵編',
          created_at  TIMESTAMP NOT NULL,
          updated_at  TIMESTAMP,
          deleted_at  TIMESTAMP
        );
        DROP TABLE IF EXISTS sec_role;
        DROP SEQUENCE IF EXISTS sec_role_id_seq;
        CREATE SEQUENCE sec_role_id_seq START WITH 1;
        CREATE TABLE sec_role (--角色表
          id         BIGINT      NOT NULL DEFAULT NEXTVAL('sec_role_id_seq'PRIMARY KEY,
          name       VARCHAR(50) NOT NULL COMMENT '名稱',
          value      VARCHAR(50) NOT NULL COMMENT '值',
          intro      VARCHAR(255) COMMENT '簡介',
          pid        BIGINT DEFAULT 0 COMMENT '父級id',
          left_code  BIGINT DEFAULT 0 COMMENT '數據左邊碼',
          right_code BIGINT DEFAULT 0 COMMENT '數據右邊碼',
          created_at TIMESTAMP   NOT NULL,
          updated_at TIMESTAMP,
          deleted_at TIMESTAMP
        );
        DROP TABLE IF EXISTS sec_user_role;
        DROP SEQUENCE IF EXISTS sec_user_role_id_seq;
        CREATE SEQUENCE sec_user_role_id_seq START WITH 1;
        CREATE TABLE sec_user_role (--用戶角色關系表
          id      BIGINT NOT NULL DEFAULT NEXTVAL('sec_user_role_id_seq'PRIMARY KEY,
          user_id BIGINT NOT NULL,
          role_id BIGINT NOT NULL
        );
        DROP TABLE IF EXISTS sec_permission;
        DROP SEQUENCE IF EXISTS sec_permission_id_seq;
        CREATE SEQUENCE sec_permission_id_seq START WITH 1;
        CREATE TABLE sec_permission (--權限表
          id         BIGINT      NOT NULL DEFAULT NEXTVAL('sec_permission_id_seq'PRIMARY KEY,
          name       VARCHAR(50) NOT NULL COMMENT '名稱',
          value      VARCHAR(50) NOT NULL COMMENT '值',
          url        VARCHAR(255) COMMENT 'url地址',
          intro      VARCHAR(255) COMMENT '簡介',
          pid        BIGINT DEFAULT 0 COMMENT '父級id',
          left_code  BIGINT DEFAULT 0 COMMENT '數據左邊碼',
          right_code BIGINT DEFAULT 0 COMMENT '數據右邊碼',
          created_at TIMESTAMP   NOT NULL,
          updated_at TIMESTAMP,
          deleted_at TIMESTAMP
        );
        DROP TABLE IF EXISTS sec_role_permission;
        DROP SEQUENCE IF EXISTS sec_role_permission_id_seq;
        CREATE SEQUENCE sec_role_permission_id_seq START WITH 1;
        CREATE TABLE sec_role_permission (--角色權限關系表
          id            BIGINT NOT NULL DEFAULT NEXTVAL('sec_role_permission_id_seq'PRIMARY KEY,
          role_id       BIGINT NOT NULL,
          permission_id BIGINT NOT NULL
        );

                數據結構基本完成,提示:pid,left_code,right_code是數據的樹形結構設計和權限無關

                測試數據:

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        43
        --create role--
        INSERT INTO sec_role(id,name, value, intro, pid,left_code,right_code,created_at)
        VALUES (sec_role_id_seq.nextval,'超級管理員','R_ADMIN','',0,1,8, current_timestamp),
               (sec_role_id_seq.nextval,'系統管理員','R_MANAGER','',1,2,7,current_timestamp),
               (sec_role_id_seq.nextval,'會員','R_MEMBER','',2,3,4,current_timestamp),
               (sec_role_id_seq.nextval,'普通用戶','R_USER','',2,5,6,current_timestamp);
        --create permission--
        INSERT INTO sec_permission(id, name, value, url, intro,pid,left_code,right_code, created_at)
        VALUES (sec_permission_id_seq.nextval,'管理員目錄','P_D_ADMIN','/admin/**','',0,1,6,current_timestamp),
               (sec_permission_id_seq.nextval,'角色權限管理','P_ROLE','/admin/role/**','',1,2,3,current_timestamp),
               (sec_permission_id_seq.nextval,'用戶管理','P_USER','/admin/user/**','',1,4,5,current_timestamp),
               (sec_permission_id_seq.nextval,'會員目錄','P_D_MEMBER','/member/**','',0,9,10,current_timestamp),
               (sec_permission_id_seq.nextval,'普通用戶目錄','P_D_USER','/user/**','',0,11,12,current_timestamp);
        INSERT INTO sec_role_permission(id,role_id, permission_id)
        VALUES (sec_role_permission_id_seq.nextval,1,1),(sec_role_permission_id_seq.nextval,1,2),
               (sec_role_permission_id_seq.nextval,1,3),(sec_role_permission_id_seq.nextval,1,4),
               (sec_role_permission_id_seq.nextval,1,5),
               (sec_role_permission_id_seq.nextval,2,1),(sec_role_permission_id_seq.nextval,2,3),
               (sec_role_permission_id_seq.nextval,2,4),(sec_role_permission_id_seq.nextval,2,5),
               (sec_role_permission_id_seq.nextval,3,4),(sec_role_permission_id_seq.nextval,3,5),
               (sec_role_permission_id_seq.nextval,4,5);
          --user data--
        --create  admin--
        INSERT INTO sec_user(id, username, providername, email, mobile, password, hasher, salt, avatar_url, first_name, last_name, full_name,department_id, created_at)
        VALUES (sec_user_id_seq.nextval,'admin','dreampie','wangrenhui1990@gmail.com','18611434500','$shiro1$SHA-256$500000$ZMhNGAcL3HbpTbNXzxxT1Q==$wRi5AF6BK/1FsQdvISIY1lJ9Rm/aekBoChjunVsqkUU=','default_hasher','','','仁輝','王','仁輝&middot;王',1,current_timestamp),
               (sec_user_id_seq.nextval,'aaaaa','dreampie','aaaaa@gmail.com','18511400000','$shiro1$SHA-256$500000$ZMhNGAcL3HbpTbNXzxxT1Q==$wRi5AF6BK/1FsQdvISIY1lJ9Rm/aekBoChjunVsqkUU=','default_hasher','','','金彤','劉','金彤&middot;劉',2,current_timestamp);
        --create user_info--
        INSERT INTO sec_user_info(id, user_id, creator_id, gender,province_id,city_id,county_id,street,created_at)
        VALUES (sec_user_info_id_seq.nextval,1,0,0,1,2,3,'人民大學',current_timestamp),
               (sec_user_info_id_seq.nextval,2,0,0,1,2,3,'人民大學',current_timestamp);
        --create user_role--
        INSERT INTO sec_user_role(id, user_id, role_id)
        VALUES (sec_user_role_id_seq.nextval,1,1),
               (sec_user_role_id_seq.nextval,2,2);

                接下來實現兩個關鍵接口,一個是shiro的JdbcRealm:        

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        43
        44
        45
        46
        47
        48
        49
        50
        51
        52
        53
        54
        55
        56
        57
        58
        59
        60
        61
        62
        63
        64
        65
        66
        67
        68
        69
        70
        71
        72
        73
        74
        75
        76
        77
        78
        79
        80
        81
        82
        83
        84
        85
        86
        87
        88
        89
        90
        91
        92
        93
        94
        95
        96
        97
        98
        99
        100
        101
        102
        103
        104
        105
        106
        public class MyJdbcRealm extends AuthorizingRealm {
          /**
           * 登錄認證
           *
           * @param token
           * @return
           * @throws org.apache.shiro.authc.AuthenticationException
           */
          protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
            UsernamePasswordToken userToken = (UsernamePasswordToken) token;
            User user = null;
            String username = userToken.getUsername();
            if (ValidateKit.isEmail(username)) {
              user = User.dao.findFirstBy(" `user`.email =? AND `user`.deleted_at is null", username);
            else if (ValidateKit.isMobile(username)) {
              user = User.dao.findFirstBy(" `user`.mobile =? AND `user`.deleted_at is null", username);
            else {
              user = User.dao.findFirstBy(" `user`.username =? AND `user`.deleted_at is null", username);
            }
            if (user != null) {
              SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getStr("password"), getName());
              return info;
            else {
              return null;
            }
          }
          /**
           * 授權查詢回調函數, 進行鑒權但緩存中無用戶的授權信息時調用.
           *
           * @param principals
           * @return
           */
          protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
            String loginName = ((User) principals.fromRealm(getName()).iterator().next()).get("username");
            SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
            Set<String> roleSet = new LinkedHashSet<String>(); // 角色集合
            Set<String> permissionSet = new LinkedHashSet<String>();  // 權限集合
            List<Role> roles = null;
            User user = User.dao.findFirstBy(" `user`.username =? AND `user`.deleted_at is null", loginName);
            if (user != null) {
              //遍歷角色
              roles = Role.dao.findUserBy("", user.getLong("id"));
            else {
              SubjectKit.getSubject().logout();
            }
            loadRole(roleSet, permissionSet, roles);
            info.setRoles(roleSet); // 設置角色
            info.setStringPermissions(permissionSet); // 設置權限
            return info;
          }
          /**
           * @param roleSet
           * @param permissionSet
           * @param roles
           */
          private void loadRole(Set<String> roleSet, Set<String> permissionSet, List<Role> roles) {
            List<Permission> permissions;
            for (Role role : roles) {
              //角色可用
              if (role.getDate("deleted_at") == null) {
                roleSet.add(role.getStr("value"));
                permissions = Permission.dao.findByRole("", role.getLong("id"));
                loadAuth(permissionSet, permissions);
              }
            }
          }
          /**
           * @param permissionSet
           * @param permissions
           */
          private void loadAuth(Set<String> permissionSet, List<Permission> permissions) {
            //遍歷權限
            for (Permission permission : permissions) {
              //權限可用
              if (permission.getDate("deleted_at") == null) {
                permissionSet.add(permission.getStr("value"));
              }
            }
          }
          /**
           * 更新用戶授權信息緩存.
           */
          public void clearCachedAuthorizationInfo(Object principal) {
            SimplePrincipalCollection principals = new SimplePrincipalCollection(principal, getName());
            clearCachedAuthorizationInfo(principals);
          }
          /**
           * 清除所有用戶授權信息緩存.
           */
          public void clearAllCachedAuthorizationInfo() {
            Cache<Object, AuthorizationInfo> cache = getAuthorizationCache();
            if (cache != null) {
              for (Object key : cache.keys()) {
                cache.remove(key);
              }
            }
          }
        }

             實現數據庫權限的初始化加載:

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        public class MyJdbcAuthzService implements JdbcAuthzService {
          @Override
          public Map<String, AuthzHandler> getJdbcAuthz() {
            //加載數據庫的url配置
            Map<String, AuthzHandler> authzJdbcMaps = new HashMap<String, AuthzHandler>();
            //遍歷角色
            List<Role> roles = Role.dao.findAll();
            List<Permission> permissions = null;
            for (Role role : roles) {
              //角色可用
              if (role.getDate("daleted_at") == null) {
                permissions = Permission.dao.findByRole("", role.get("id"));
                //遍歷權限
                for (Permission permission : permissions) {
                  //權限可用
                  if (permission.getDate("daleted_at") == null) {
                    if (permission.getStr("url") != null && !permission.getStr("url").isEmpty()) {
                      authzJdbcMaps.put(permission.getStr("url"), new JdbcPermissionAuthzHandler(permission.getStr("value")));
                    }
                  }
                }
              }
            }
            return authzJdbcMaps;
          }
        }

      前臺使用驗證碼時傳入username,password,captcha  三個參數,第三個是驗證碼參數名,提前把驗證碼內容存入session,shiro會自動進行驗證,注意名稱為captcha

      主要結構是權限表里的url-value,如果需要訪問

      1
      url:  /admin/**   需要value:P_D_ADMIN

      把這些權限綁定到角色之后,角色綁定給用戶就相當于,用戶下面有很多這些  url-value

          1.系統啟動的時候把這個對應關系加載到內存或者緩存  //cn.dreampie.shiro.core.ShiroKit

          2. 用戶登錄的時候把用戶對應的角色所有的權限加載到緩存,這一步是shiro自己實現

          3.當用戶訪問某個url的時候 如訪問/admin/index,過濾器會匹配到/admin/**,這個url需要擁有P_D_ADMIN的權限

          4.然后使用shiro的接口hasPremission(value),判斷用戶是否擁有這個權限//cn.dreampie.shiro.core.ShiroInterceptor

          5.放行或者拒絕訪問返回403狀態

      jfinal-shiro支持Ajax登陸/退出,使用json數據

      如果你使用freemarker作為模板,推薦使用jfinal-shiro-freemarker標簽庫 http://my.oschina.net/wangrenhui1990/blog/312741

      https://github.com/Dreampie?tab=repositories 目錄下有多款插件:

      cn.dreampie.jfinal-shiro     https://github.com/Dreampie/jfinal-shiro    shiro插件

      cn.dreampie.jfinal-shiro-freemarker   https://github.com/Dreampie/jfinal-shiro-freemarker    shiro插件實現的freemarker標簽庫

      cn.dreampie.jfinal-web     https://github.com/Dreampie/jfinal-web   相關web插件,簡潔model實現

      cn.dreampie.jfinal-utils        https://github.com/Dreampie/jfinal-utils   部分jfinal工具

      cn.dreampie.jfinal-tablebind        https://github.com/Dreampie/jfinal-tablebind   jfinal的table自動綁定插件,支持多數據源

      cn.dreampie.jfinal-flyway      https://github.com/Dreampie/jfinal-flyway   數據庫腳本升級插件,開發中升級應用時,使用腳本同步升級數據庫或者回滾

      cn.dreampie.jfinal-captcha      https://github.com/Dreampie/jfinal-captcha   基于jfinal render的超簡單驗證嗎插件

      cn.dreampie.jfinal-quartz       https://github.com/Dreampie/jfinal-quartz   基于jfinal 的quartz管理器

      cn.dreampie.jfinal-sqlinxml      https://github.com/Dreampie/jfinal-sqlinxml   基于jfinal 的類似ibatis的sql語句管理方案

      cn.dreampie.jfinal-lesscss       https://github.com/Dreampie/jfinal-lesscss   java實現的lesscsss實時編譯插件,可以由于jfinal

      cn.dreampie.jfinal-coffeescript     https://github.com/Dreampie/jfinal-coffeescript   java實現的coffeescript實時編譯插件,可以由于jfinal 

      cn.dreampie.jfinal-akka    https://github.com/Dreampie/jfinal-akka   java使用akka執行異步任務

      cn.dreampie.jfinal-mailer       https://github.com/Dreampie/jfinal-mailer   使用akka發布郵件的jfinal插件

      cn.dreampie.jfinal-slf4j     https://github.com/Dreampie/jfinal-slf4j   讓jfinal使用slf4j的日志api

      部分內容借鑒了網絡資料

      評論7

      • 1樓:liuxuehua12 發表于 2014-10-17 15:38 回復此評論
        你好,我用了你的這個權限插件,發現授權不對,/login頁面都攔截了
        我參考了你示例的shiro.ini配置,麻煩看下對不?
        [users]
        guest = guest,guest

        [main]
        authc = cn.dreampie.shiro.ShiroFormAuthenticationFilter //這里為什么用自己的?不明白
        authc.loginUrl = /login

        authc.successUrl = /
        authc.failureUrl = /login

        signout = cn.dreampie.shiro.ShiroLogoutFilter //這里為什么用自己的?不明白
        signout.redirectUrl = /login

        #anon = cn.dreampie.shiro.ShiroAnonymousFilter

        #realm
        jdbcRealm = com.sxtaxi.common.shiro.MyJdbcRealm
        securityManager.realm = $jdbcRealm


      • 2樓:liuxuehua12 發表于 2014-10-17 15:39 回復此評論
        passwordService = org.apache.shiro.authc.credential.DefaultPasswordService
        passwordMatcher = cn.dreampie.shiro.ShiroPasswordMatcher
        passwordMatcher.passwordService = $passwordService
        jdbcRealm.credentialsMatcher = $passwordMatcher

        #cache
        shiroCacheManager = org.apache.shiro.cache.ehcache.EhCacheManager
        shiroCacheManager.cacheManagerConfigFile = classpath:ehcache.xml
        securityManager.cacheManager = $shiroCacheManager

        #session
        sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO
        sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
        sessionDAO.activeSessionsCacheName = shiro-activeSessionCache
        sessionManager.sessionDAO = $sessionDAO
        securityManager.sessionManager = $sessionManager
        sessionListener = cn.dreampie.shiro.listeners.ShiroSessionListener
        securityManager.sessionManager.sessionListeners = $sessionListener

      • 3樓:liuxuehua12 發表于 2014-10-17 15:39 回復此評論
        securityManager.sessionManager.globalSessionTimeout = 1200000
        ;sessionValidationScheduler = org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler
        ;sessionValidationScheduler.interval = 1200000
        ;securityManager.sessionManager.sessionValidationScheduler = $sessionValidationScheduler
        securityManager.sessionManager.sessionValidationSchedulerEnabled = false
        securityManager.sessionManager.deleteInvalidSessions = false
        ;securityManager.subjectDAO.sessionStorageEvaluator.sessionStorageEnabled = false

        [urls]
        /login = anon
        /checklogin = anon
        /logout = signout
        /** = authc
      • 4樓:liuxuehua12 發表于 2014-10-17 16:20 回復此評論
        我在ShiroInterceptor中添加對上面幾個的過濾就沒問題了
        private String[] noans = {"/login","/login/","/checklogin"};
        @Override
        public void intercept(ActionInvocation ai) {
           String actionKey = ai.getActionKey();
        //路徑權限 //注解權限
           //過濾不需要權限控制的
           boolean need = true;
           for(String p : noans){
             if(p.equalsIgnoreCase(actionKey)){
               need = false;
               break;
             }
           }
          if(need){
           List<AuthzHandler> ahs = ShiroKit.getAuthzHandler(ai.getController().getRequest(), actionKey);
           //權限驗證
           if (assertNoAuthorized(ai, ahs)) return;
          }
        // 執行正常邏輯
        ai.invoke();
        }
      • 5樓:王仁輝(java) 發表于 2014-10-17 18:41 回復此評論

        引用來自“liuxuehua12”的評論

        securityManager.sessionManager.globalSessionTimeout = 1200000
        ;sessionValidationScheduler = org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler
        ;sessionValidationScheduler.interval = 1200000
        ;securityManager.sessionManager.sessionValidationScheduler = $sessionValidationScheduler
        securityManager.sessionManager.sessionValidationSchedulerEnabled = false
        securityManager.sessionManager.deleteInvalidSessions = false
        ;securityManager.subjectDAO.sessionStorageEvaluator.sessionStorageEnabled = false

        [urls]
        /login = anon
        /checklogin = anon
        /logout = signout
        /** = authc
        /login 如果是你的登陸url 配置為 /login=authc #authc 指的是上面配置的filter ShiroFormAuthenticationFilter /logout 退出登陸url 配置為 /logout = signout # signout 指的是上面配置的filter ShiroLogoutFilter 您的配置 應該是 /login = authc /logout = signout /** = anon /checklogin 不用配 它被 /**=anon包含了 anon表示不會經過登錄和退出相關的filter,除了登陸和退出的權限 其他權限都存在數據庫里 如果還有問題 qq:173956022 聯系我
      • 6樓:delicate 發表于 2014-10-21 11:12 回復此評論
        博主 有沒有獨立的jfinal+shiro的demo啊
      • 7樓:王仁輝(java) iPhone 發表于 2014-10-21 20:48 回復此評論

        引用來自“王仁輝(java)”的評論

        引用來自“delicate”的評論

        博主 有沒有獨立的jfinal+shiro的demo啊

        點擊此處輸入評論
        暫時沒有,你可以把前端換成freemarker,完全不影響使用,現在有些同學已經在用了,你也可以試試

        本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發表

        請遵守用戶 評論公約

        類似文章 更多

        主站蜘蛛池模板: 乱码中字在线观看一二区| 亚洲国产精品人人做人人爱| 亚洲欧美综合精品二区| 亚洲 校园 欧美 国产 另类| 国产普通话对白刺激| 国产97视频人人做人人爱| 亚洲AV毛片一区二区三区| 亚洲精品一区二区天堂| 国产日产欧产精品精品| 国产福利酱国产一区二区| 精品一卡2卡三卡4卡乱码精品视频 | 公喝错春药让我高潮| 四虎影视永久无码精品| 精品国产AV无码一道| 黄又色又污又爽又高潮| 中文无码AV一区二区三区| 国产成人午夜精品福利| AV免费网址在线观看| 国产欧美综合在线观看第十页| 久久经精品久久精品免费观看| 亚洲精品中文av在线| 午夜天堂精品久久久久| 久久亚洲2019中文字幕| 亚洲午夜无码久久久久蜜臀av| 伊人色综合久久天天小片| 国产精品中文字幕在线| 美女黄18以下禁止观看| 亚洲午夜成人精品电影在线观看| 中文无码熟妇人妻AV在线| 无码毛片一区二区本码视频| 久久精品一本到99热免费| 欧美性XXXX极品HD欧美风情| 中文字幕亚洲制服在线看| 精品国产成人A区在线观看| 麻豆最新国产AV原创精品| 丰满无码人妻热妇无码区| 国产精品未满十八禁止观看| 国产很色很黄很大爽的视频| 日本一区二区三区免费播放视频站| 亚洲AV永久无码精品主页| 国产成人精品亚洲日本在线观看|