自定义shiro实现权限验证方法isAccessAllowed

由于Shiro filterChainDefinitions中 roles默认是and, admin= user,roles[system,general] 
比如:roles[system,general] ,表示同时需要“system”和“general” 2个角色(权限)才通过认证,缺一不可。
但是在实际业务中,一个端口往往同时对几个角色开放。比如管理员账号拥有访问所有端口的权限。那么此时的and显然是不合时宜的,与之替代的是or

一、重新实现AuthorizationFilter类
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authz.AuthorizationFilter;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 * @Auther: lanhaifeng
 * @Date: 2019/4/18 0018 17:40
 * @Description:支持多角色验证
 * 由于Shiro filterChainDefinitions中 roles默认是and,
 * = user,roles[system,general]
 * 比如:roles[system,general] ,表示同时需要“system”和“general” 2个角色才通过认证
 * 但是在实际业务中,一个端口的权限往往对多个角色开放(比如管理员可以使用一切权利)
 */
public class MyRolesAuthorizationFilter extends AuthorizationFilter{

    @Override
    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)
            throws Exception {
        Subject subject = getSubject(request, response);
        String[] rolesArray = (String[]) mappedValue;
        //没有权限访问
        if (rolesArray == null || rolesArray.length == 0) {
            return true;
        }
        for (int i = 0; i < rolesArray.length; i++) {
            //若当前用户是rolesArray中的任何一个,则有权限访问
            if (subject.hasRole(rolesArray[i])) {
                return true;
            }
        }
        
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Apache Shiro 是一个功能强大的Java安全框架,可以用来实现身份验证、授权、加密、会话管理等安全相关的功能。下面是使用 Apache Shiro 实现权限控制的一些步骤: 1. 引入 Apache Shiro 的依赖:在项目中引入 Apache Shiro 的相关依赖,包括 shiro-core 和 shiro-web。 2. 配置 Shiro:在项目中配置 Shiro 相关的配置文件,如 shiro.ini 或 shiro.xml。 3. 编写 Realm:在 Shiro 中,Realm 是用来获取安全数据(如用户、角色、权限等)的组件。需要根据具体的业务需求编写自己的 Realm 实现类,并在 Shiro 配置文件中进行配置。 4. 实现权限控制:在代码中使用 Shiro 的 Subject 对象进行权限控制,可以通过调用 Subject 的 hasRole() 和 isPermitted() 方法来判断用户是否具有某个角色或权限。 下面是一个简单的示例代码: ``` // 获取当前用户 Subject currentUser = SecurityUtils.getSubject(); // 判断用户是否有某个角色 if (currentUser.hasRole("admin")) { // 执行管理员操作 } else { // 没有管理员角色,执行普通用户操作 } // 判断用户是否有某个权限 if (currentUser.isPermitted("user:create")) { // 执行创建用户操作 } else { // 没有创建用户权限,执行其他操作 } ``` 需要注意的是,使用 Apache Shiro 实现权限控制时,需要先进行身份验证(即用户登录),才能进行权限控制。可以使用 Shiro 的 Authentication API 进行身份验证,例如: ``` UsernamePasswordToken token = new UsernamePasswordToken(username, password); try { currentUser.login(token); } catch (AuthenticationException e) { // 身份验证失败 } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值