• Shiro配置文件ini详解


    2017年07月09日 18:54:02 lfendo 阅读数:7563

     https://blog.csdn.net/u011781521/article/details/74892074

    一、INI简介

    INI配置文件是一种key/value的键值对配置,提供了分类的概念,每一个类中的key不可重复,#号代表注释,shiro.ini文件默认在/WEB-INF/ 或classpath下,shiro会自动查找,INI配置文件一般适用于用户少且不需要在运行时动态创建的情景下使用。

    1.在web.xml中配置shiro的过滤器

    要使用Shiro必须在web.xml中配置shiro,在web.xml 中自定义shiro.ini位置(默认位置)/WEB-INF/shiro.ini or classpath:shiro.ini, 加入以下内容:

    <filter>
    
        <filter-name>ShiroFilter</filter-name>
    
        <filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class>
    
        <init-param>
    
            <param-name>configPath</param-name>
        
            <param-value>/WEB-INF/shiro.ini</param-value>
    
        </init-param>
    
    </filter>

    2.shiro.ini示例

    
     
    1. 用户

    2. [users]

    3. #用户zhang的密码是123,此用户具有role1和role2两个角色

    4. zhang=123,role1,role2

    5. wang=123,role2

    6.  
    7. #权限

    8. [roles]

    9. #角色role1对资源user拥有create、update权限

    10. role1=user:create,user:update

    11. #角色role2对资源user拥有create、delete权限

    12. role2=user:create,user:delete

    13. #角色role3对资源user拥有create权限

    14. role3=user:create

    ini配置中主要配置有四大类:main,users,roles,urls

    
     
    1. [main]

    2. #提供了对根对象 securityManager 及其依赖的配置

    3. securityManager=org.apache.shiro.mgt.DefaultSecurityManager

    4. …………

    5. securityManager.realms=$jdbcRealm

    6.  
    7. [users]

    8. #提供了对用户/密码及其角色的配置,用户名=密码,角色 1,角色 2

    9. username=password,role1,role2

    10.  
    11.  
    12. [roles]

    13. #提供了角色及权限之间关系的配置,角色=权限 1,权限 2

    14. role1=permission1,permission2

    15.  
    16.  
    17. [urls]

    18. #用于 web,提供了对 web url 拦截相关的配置,url=拦截器[参数],拦截器

    19. /index.html = anon

    20. /admin/** = authc, roles[admin], perms["permission1"]

    1、[main]

    main主要配置shiro的一些对象,例如securityManager ,Realm,authenticator,authcStrategy 等等,例如

    
     
    1. #声明一个realm

    2. MyRealm1=com.shiro.mutilrealm.MyRealm1

    3. MyRealm2=com.shiro.mutilrealm.MyRealm2

    4.  
    5. #配置验证器

    6. authenticator = org.apache.shiro.authc.pam.ModularRealmAuthenticator

    7.  
    8. # AllSuccessfulStrategy 表示 MyRealm1和MyRealm2 认证都通过才算通过

    9. #配置策略

    10. #authcStrategy = org.apache.shiro.authc.pam.AllSuccessfulStrategy

    11. authcStrategy = com.shiro.authenticationstrategy.MyAuthenticationStrategy

    12.  
    13.  
    14. #将验证器和策略关联起来

    15. authenticator.authenticationStrategy = $authcStrategy

    16.  
    17.  
    18. #配置验证器所使用的Realm

    19. authenticator.realms=$MyRealm2,$MyRealm1

    20.  
    21. #把Authenticator设置给securityManager

    22. securityManager.authenticator = $authenticator


    除了对象之外,也可以使用byte数组,集合,map等等

    例如:

    byte数组
     

    authenticator.bytes=0x68656c6c6f69


    集合

    
     
    1. authenticator.array=1,2,3

    2. securityManager.sessionManager.sessionListeners = $sessionListener1,$sessionListener2


    map(键值对使用冒号来限定 key:value)

    authenticator.map=$jdbcRealm:$jdbcRealm,1:1,key:abc


    在web应用中,我们可以进行以下配置,表示如果用户没有登录进行访问时,将自动跳转到/login页面

    authc.loginUrl=/login

    2、[users]

    [users]允许你配置一组静态的用户,包含用户名,密码,角色,一个用户可以有多个角色,可以配置多个角色,例如:

    username = password, roleName1, roleName2, …, roleNameN


    这里涉及到密码,就牵扯到加密的问题,我们可以MD5,Sha1,Sha256等算法进行加密

    
     
    1. [main]

    2.  
    3. #告诉shiro我们用哪个加密算法

    4. sha256Matcher = org.apache.shiro.authc.credential.Sha256CredentialsMatcher

    5. iniRealm.credentialsMatcher = $sha256Matcher

    6.  
    7. [users]

    8.  
    9. #用户名=密码,角色

    10. admin=355b1bbfc96725cdce8f4a2708fda310a80e6d13315aec4e5eed2a75fe8032ce,role1


    获取密码的 hex 加密字符串

    String ss = new Sha256Hash("cc").toHex();

    3、[roles]

    [roles]将角色和权限关联起来,格式为:角色名=权限字符串1,权限字符串2…..,例如

    role1 = printer:create,printer:query


    限标识符号规则:【中间用“:”(半角冒号分隔)】

            |---资源:操作【user:create:表示对用户资源进行create操作】【等价于:user:create:*(对所有的用户实例进行操作)】
            |---资源:操作:实例【user:create:01:表示对用户资源的01实例进行create操作】
            |---例子:【user:*:01 表示对用户资源的01实例进行所有操作】

    权限表示的几种方式:


    (1)用简单的字符串来表示一个权限,如:user (相当于:user:*)


    (2)多层次管理

    2.1 printer:print

    其中第一部分是权限被操作的领域(打印机),第二部分是被执行的操作

    2.2 多个值

    多个值使用逗号隔开,如role1 = fendo:create,fendo:query 
    不一定要xxx:yyyy的形式,也可以直接使用简单字符串

    2.3 可以使用*号表示所有

    比如printer:* ,表示你可以对打印机进行任何操作, 
    或者使用 *:query ,表示你在任何领域下,都有查询操作

    (3)实例级权限:域:操作:实例


    如:user:edit:manager 只能对 user 中的 manager 进行 edit。

    通配符:user:edit:*、user:*:*、user:*:manager

    等价:user:edit==user:edit:*、user == user:*:* 只能从字符串结尾处省略。

    注意:

        如果一个独立的 permissionDefinition 需要被内部逗号分隔(例如,printer:5thFloor:print,info),则需要用户双引号环绕该定义,以避免错误解析。  

        如果角色不想关联权限,则不需要在 [roles] 部分把它们列出来。只需定义在 [user] 部分中定义角色名就足以创建尚不存在的角色。

        仅定义非空的 [users] 或 [roles] 部分就将自动地触发org.apache.shiro.realm.text.IniRealm 实例的创建

    4、[urls]

    这部分配置主要在web应用中,格式为:url=拦截器[参数],拦截器[参数]……,例如

    
     
    1. /login=anon

    2. /unauthorized=anon

    3. /static/**=anon

    4. /authenticated=authc

    5. /role=authc,roles[admin]

    6. /permission=authc,perms["user:create"]

    说明:

    
     
    1. anon: 表示匿名访问,即不需要登录就可以访问,例如/login这个路径可以匿名访问

    2. authe: 表示需要登录才能访问

    3. roles[admin]: 表示有admin这个角色的用户才能访问

    4. perms["user:create"]: 表示有这个权限的才能访问

    url通配符语法:

    
     
    1. ?:匹配一个字符

    2. *:匹配零个或多个字符

    3. **:匹配零个或多个路径


    url匹配顺序是按照你配置的顺序

  • 相关阅读:
    HDU 2655 主席树
    Codeforces Round #169 (Div. 2) A水 B C区间更新 D 思路
    Codeforces Round #402 (Div. 2) A B C sort D二分 (水)
    Docker 网络 Flannel
    Docker 搭建 etcd 集群及管理
    Iptables 端口转发
    CentOS7 citus9.5 集群安装及管理
    Ubuntu 忘记密码
    Zookeeper 启动错误
    数据结构 B树 B+树 B*树 LSM-树
  • 原文地址:https://www.cnblogs.com/grj001/p/12225693.html
Copyright © 2020-2023  润新知