描述:配置文件中配置了访问了未授权之后的跳转地址,但结果没能跳转过去,而是直接在页面上抛出未授权异常
分析原因:配置文件可能需要做额外的处理
最终解决方案:
方案1:
<!-- 定义需要特殊处理的异常,用类名或完全路径名作为key,异常页名作为值 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="org.apache.shiro.authz.UnauthorizedException">/Denied</prop>
</props>
</property>
</bean>
方案2:
不使用注解,而是用配置文件配置url的权限
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- Shiro的核心安全接口,这个属性是必须的 -->
<property name="securityManager" ref="securityManager"/>
<!-- 要求登录时的链接(登录页面地址),非必须的属性,默认会自动寻找Web工程根目录下的"/login.jsp"页面 -->
<property name="loginUrl" value="/showLogin"/>
<!-- 登录成功后要跳转的连接(本例中此属性用不到,因为登录成功后的处理逻辑在LoginController里硬编码) -->
<!-- <property name="successUrl" value="/" ></property> -->
<!-- 用户访问未对其授权的资源时,所显示的连接 但是使用注解的话这段不起作用,需要使用异常处理器重定向页面-->
<property name="unauthorizedUrl" value="/denied"/>
<property name="filterChainDefinitions">
<value>
/Admin=roles[admin]
/Common=roles[user]
</value>
</property>
</bean>
- 原因:
shiro的源代码ShiroFilterFactoryBean.Java定义的filter必须满足filter instanceof AuthorizationFilter,只有perms,roles,ssl,rest,port才是属于AuthorizationFilter,而anon,authcBasic,auchc,user是AuthenticationFilter,所以unauthorizedUrl设置后页面不跳转
Shiro注解模式下,登录失败与没有权限都是通过抛出异常。并且默认并没有去处理或者捕获这些异常。在SpringMVC下需要配置捕获相应异常来通知用户信息