SpringMVC + Shiro 访问未授权页面时不跳转,页面打印抛异常

在SpringMVC与Shiro整合应用中遇到一个问题,配置的未授权页面跳转未能生效,而是在页面直接抛出未授权异常。分析发现ShiroFilterFactoryBean的filter限制导致unauthorizedUrl设置无效。解决方案包括调整配置文件,不依赖注解而是直接配置URL权限。在Shiro注解模式下,登录失败和权限不足都以异常形式表现,需在SpringMVC中捕获并处理这些异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 描述:配置文件中配置了访问了未授权之后的跳转地址,但结果没能跳转过去,而是直接在页面上抛出未授权异常

  • 分析原因:配置文件可能需要做额外的处理

  • 最终解决方案:

方案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下需要配置捕获相应异常来通知用户信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值