java 权限校验_权限验证 · Java高效编程 · 看云

本文介绍了Java使用Shiro进行权限校验的实现方法,包括重写MyRealm的doGetAuthorizationInfo方法以获取用户角色和资源,动态配置过滤规则以从数据库加载权限,以及修改ShiroConfiguration以应用动态配置,并通过自定义AnyPermissionsAuthorizationFilter实现或逻辑的权限验证。
摘要由CSDN通过智能技术生成

## 重写MyRealm中的doGetAuthorizationInfo方法

```

@Override

protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {

User user = (User) SecurityUtils.getSubject().getPrincipal();

if(user!=null){

SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();

//获取当前用户角色

String role = user.getUserRole().getName();

authorizationInfo.addRole(role);

//获取当前用户的资源ID

String [] perms = user.getUserRole().getJurisdiction().getSaid().split(",");

for(String prem :perms){

authorizationInfo.addStringPermission(prem);

}

return authorizationInfo;

}

return null;

}

```

## 动态配置过滤规则

在resources文件下创建shiro.ini,添加默认的权限配置

格式如下:

```

[urls]

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

/index.html = anon

/admin/** = authc, roles[admin]

```

创建MyChainDefinitions动态加载权限配置

```

import org.apache.shiro.config.Ini;

import org.apache.shiro.web.config.IniFilterChainResolverFactory;

import org.springframework.beans.factory.FactoryBean;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.util.CollectionUtils;

import java.io.InputStream;

import java.text.MessageFormat;

import java.util.Map;

public class MyChainDefinitions implements FactoryBean {

public static final String PREMISSION_STRING = "perms[{0}]";

private InputStream filterChainDefinitions;

public void setFilterChainDefinitions(InputStream filterChainDefinitions) {

this.filterChainDefinitions = filterChainDefinitions;

}

@Autowired

private JurisdictionService jurisdictionService;

@Override

public Ini.Section getObject() {

/** 查询数据库中所有的资源格式为:

* url role

* 资源路径,角色,角色1,角色2...

*/

Map urls =JurisdictionService.findByCondition();

//加载配置默认的过滤链

Ini ini = new Ini();

ini.load(filterChainDefinitions);

Ini.Section section = ini.getSection(IniFilterChainResolverFactory.URLS);

if (CollectionUtils.isEmpty(section)) {

section = ini.getSection(Ini.DEFAULT_SECTION_NAME);

}

for (String url : urls.keySet()) {

String[] perms = urls.get(url).split(",");

StringBuilder permFilters = new StringBuilder();

for (int i = 0; i < perms.length; i++) {

permFilters.append(perms[i]).append(",");

}

//去掉末尾的逗号

String str = permFilters.substring(0, permFilters.length() - 1);

//生成结果如:/dotest1.html = authc, perms[admin]

section.put(url, MessageFormat.format(PREMISSION_STRING, str));

}

return section;

}

@Override

public Class> getObjectType() {

return this.getClass();

}

@Override

public boolean isSingleton() {

return false;

}

}

```

## 修改ShiroConfiguration

```

1,增加myChainDefinitions方法

private MyChainDefinitions myChainDefinitions(){

MyChainDefinitions myChainDefinitions = new MyChainDefinitions();

ClassPathResource classPathResource = new ClassPathResource("shiro.ini");

try {

InputStream inputStream = classPathResource.getInputStream();

myChainDefinitions.setFilterChainDefinitions(inputStream);

} catch (IOException e) {

e.printStackTrace();

}

return myChainDefinitions;

},2,修改shiroFilterFactoryBean方法

删除配置URL的filterChainDefinitionMap

将shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap)

替换为

shiroFilterFactoryBean.setFilterChainDefinitionMap(myChainDefinitions().getObject());

```

## 将权限改为|| 之前默认是&&

```

import org.apache.shiro.subject.Subject;

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

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

public class AnyPermissionsAuthorizationFilter extends AuthorizationFilter {

@Override

protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object mappedValue) throws Exception {

Subject subject = getSubject(servletRequest, servletResponse);

String[] perms = (String[]) mappedValue;

for (String perm : perms) {

if (subject.isPermitted(perm)) {

return true;

}

}

return false;

}

}

```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值