不归客
你可以仿照获取roles这个方法去数据库获取,或者直接手写一个
是在CustomRealm这个类中的
慕瓜9959598
这个需要apache的common pool包
过河的小马
找到原因了 pom文件的jar冲突了,已解决。。。
切yi
youngledo
是通过过滤器来跳转的login.html的呀,你看你的spring.xml配置
这一行就告诉了登录的页面为login.html。
那么怎么判断是否已经登录呢,自定义Realm(或者IniRealm和JdbcRealm)的作用不就是来认证和授权的吗。
在spring.xml中已经配置了SecurityManager,将realm属性注入。

当你去访问url的时候,就会被过滤器拦截,然后调用自定义Realm重写的doGetAuthenticationInfo
方法进行认证,如果用户登录则进行授权判断,否则跳转到logUrl即login.html进行登录。
独尊123
<!--自定义过滤器注入--> <bean id="rolesOrfilter" class="cn.lanedy.filter.RolesOrfilter"/> <!--shiro过滤器--> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"/> <property name="loginUrl" value="login.html"/> <property name="unauthorizedUrl" value="403.html"/> <property name="filters"> <util:map> <entry key="rolesOr" value-ref="rolesOrfilter"/> </util:map> </property> <property name="filterChainDefinitions"> <value> /login.html = anon /subLogin = anon /testRole = roles["admin","admin1"] /testRole1 = rolesOr["admin","admin1"] /* = authc </value> </property> </bean>
独尊123
可能是你的权限没有对应或者你根本没有在数据库有这个表或者权限
果德纲
在自定义的Realm中的授权方法里,SimpleAuthorizationInfo调用addStringPermissions(menuNames)方法。 menuNames是从数据库查出来的权限名称集合。
丹布朗6
注解配置要记得将配置写到spring-mvc.xml的配置文件中,不然shiro的注解无法在controller层生效
黑色的白兔
public class RolesAuthorizationFilter extends AuthorizationFilter {
public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws IOException {
Subject subject = getSubject(request, response);
String[] rolesArray = (String[]) mappedValue;
if (rolesArray == null || rolesArray.length == 0) {
//no roles specified, so nothing to check - allow access.
return true;
}
Set<String> roles = CollectionUtils.asSet(rolesArray);
return subject.hasAllRoles(roles);
}
}
慕勒5006560
if 前面的语句是为了获取当前主体执行时所需的角色 把他放在字符集 roles中
if判断的意思是 如果roles为空或长度为零 意味着你在controller中所写的方法没有进行@RequireRoles(“admin”)这样的操作 ,也就是说你写的这个方法无需角色权限就可以访问 当然要返回true 直接访问
相反若果你写的方法进行了角色的注解 那么就要比对当前登录用户是否有该角色(也就是foreach当中的判断)
if(subject.hasRole(roles))//若果发现当前用户有该权限 则返回true 进行访问
反之亦然
qq_引渡_03228262

看有没有这一行
优秀的小伙子
qq_sir
web.xml里用过滤器的配置
FP1995XY
roles参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,当有多个参数时,每个参数通过才算通过,相当于hasAllRoles()方法。shiro的角色过滤是and的关系。
FP1995XY
这是你的xml文件没有配置xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd",配置上就有了
qq_南方
第二个问题:后面会讲session共享
第一个问题:登录的时候就是这个用户,这个用户在数据库中对应的角色权限都是有的,授权这边会将角色权限设置进来,从而和登录的用户进行判断。可以了解一下用户角色权限三张表
苏莫离
你自己都说了是UserController设置了/user,显然是这个问题
键盘兔
遇到同样问题,修改server中的server locations为第二个选项,部署到服务器发布,已经解决
键盘兔
我的理解是只有被过滤器过滤不通过的才会跳转到未验证通过页面,也就是403.html.之前教程里面的授权都是通过代码或者注解去授权。因此跳不过去。
幕布斯6035309
在过滤器哩加所需要的返回的json对象代码
3232505
嗯。。。以下是个人的理解,不知道合适不,我理解你的意思了,我们可以动态创建filterchaindefinitions,有时,在某些系统想通过读取数据库来定义org.apache.shiro.spring.web.ShiroFilterFactoryBean的filterChainDefinitions。这样能够通过操作界面或者维护后台来管理系统的链接。项目启动时,shrio通过自己的org.apache.shiro.spring.web.ShiroFilterFactoryBean类的filterChainDefinitions(授权规则定义)属性转换为一个filterChainDefinitionMap,转换完成后交给ShiroFilterFactoryBean保管。ShiroFilterFactoryBean根据授权(AuthorizationInfo类)后的信息去判断哪些链接能访问哪些链接不能访问。filterChainDefinitionMap里面的键就是链接URL,值就是存在什么条件才能访问该链接,如perms、roles。filterChainDefinitionMap是一个Map,shiro扩展出一个Map的子类Ini.Section