Shiro自定义or关系的权限和角色验证,取代perms和roles

通过百度并查看源码,shiro配置中的

/create = roles["admin","teller"]
/update = perms["c:update","c:delete"]

是并且关系,无法实现或者关系。

 可以自定义过滤器并使用自定义配置。

import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authz.AuthorizationFilter;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

/**
 * CustomerPermissionsAuthorizatonFilter, 权限or关系。如:<br/>
 * /delete = perm["c:update","c:delete"] 注意perm没有s
 */
public class CustomerPermissionsAuthorizatonFilter extends AuthorizationFilter {

    //TODO - complete JavaDoc

    public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws IOException {

        Subject subject = getSubject(request, response);
        String[] perms = (String[]) mappedValue;

        //没有权限限制,可以访问
        if (perms == null || perms.length == 0)
            return true;

        //若当前用拥有perms中的任何一个权限,则可以访问
        for (String p : perms) {
            if (subject.isPermitted(p))
                return true;
        }

        return false;
    }
}

配置shiro的xml

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
    <property name="securityManager" ref="securityManager"/>
    <property name="loginUrl" value="login"/>
    <property name="successUrl" value="/"/>
    <property name="unauthorizedUrl" value="403"/>

    <property name="filters">
        <map>
            <entry key="role">
                <bean class="com.example.demo8888.shiro.CustomRolesAuthorizationFilter" />
            </entry>
            <entry key="perm">
                <bean class="com.example.demo8888.shiro.CustomerPermissionsAuthorizatonFilter" />
            </entry>
        </map>
    </property>

    <property name="filterChainDefinitions">
        <!--
        /** 添加过滤器
         * anon 无需认证就可访问
         * authc  必须认证才能访问
         * user   有“记住我”功能或认证之后才能使用(较少使用)
         * perms: 拥有对某个资源的权限才能访问 isPermitedAll()
         * roles:  拥有某个角色权限才能访问 hasAllRoles()
         * logout 登录退出后才能访问
         * port[8081] 相应端口号才能访问
         * rest:例子/admins/user/**=rest[user],根据请求的方法, 相当于/admins/user/**=perms[user:method] ,其中method 为post,get,delete等。
         * authBasic 没有参数表 示httpBasic认证
         * ssl 没有参数,表示安全的url请求, 协议为https
         * user 没有参数,表示必须存在用户, 当登入操作时不做检查
         * 注:anon,authcBasic,authc,user是认证过滤器,perms,roles,ssl,rest,port是授权过滤器
         *//create = roles["admin","teller"]
        -->
        <value>
            /params* = anon
            /loginvue = anon
            /login = anon
            /doLogin = anon
            /read = anon
            /doLogout = logout
            /create = role["admin","teller"]
            /index = perms["*:find"]
            /update = perms["c:update","c:delete"]
            /delete = perm["c:update","c:delete"]
            /secret = authc
            /static/** = anon
            /** = user
        </value>
    </property>

</bean>

注意其中的

/create = role["admin","teller"]

/delete = perm["c:update","c:delete"]

role和perm没有s后缀。

角色代码如下。

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authz.AuthorizationFilter;

/**
 * CustomRolesAuthorizationFilter继承AuthorizationFilter接口, 角色or关系。如:<br/>
 * /create = role["admin","teller"] 注意role没有s
*/
public class CustomRolesAuthorizationFilter extends AuthorizationFilter {

    @Override
    protected boolean isAccessAllowed(ServletRequest req, ServletResponse resp, Object mappedValue) throws Exception {
        Subject subject = getSubject(req, resp);
        String[] rolesArray = (String[]) mappedValue;

        //没有角色限制,可以访问
        if (rolesArray == null || rolesArray.length == 0) {
            return true;
        }

        //若当前用户拥有rolesArray中的任何一个角色,则可以访问
        for (String role : rolesArray) {
            if (subject.hasRole(role)) {
                return true;
            }
        }

        return false;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rosyouth

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值