通过百度并查看源码,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; } }