2

我正在使用 Spring MVC、Tiles 和 Shiro。

这是我的未授权Url 属性的配置方式: <property name="unauthorizedUrl" value="/unauthorized"/>

我的期望是,当MyAuthorizingRealm发现无效凭据时,Shiro 将重定向到/unauthorized.

但是,我在提交表单时不会发生这种情况。我有一个@Controller映射到处理 GET 和 POST 操作的登录名/login。对于对 url/lists的访问,将显示登录表单。所以它似乎在一种情况下有效,但在另一种情况下无效。

@Controller
@RequestMapping(value = "/login")
public class LoginController {

    @RequestMapping(method = RequestMethod.GET)
    public String getLoginFormView(Model model) {
        return "login";
    }

    // if this method doesn't exist a Post not supported exception is thrown
    @RequestMapping(method = RequestMethod.POST)
    public String handlePost() {
        return "this view doesn't exist";
    }
}

即使我扔出我仍然AuthenticationException无法MyAuthorizingRealm.doGetAuthenticationInfo()让 Shiro 重定向到/unauthorized. 它总是以继续过滤器链结束并在@Controller;中执行 POST 方法。当然,我希望重定向。

这是我的:http webapp-context.xml: //pastebin.com/XZaCKqEC

这是我的:http web.xml: //pastebin.com/5H81Tm8A

以下是 Shiro 的一些 TRACE 日志输出。当您尝试访问时,Shiro 工作/lists。但是,当登录表单提交时,重定向/unauthorized永远不会发生。注意,检测到登录提交:http: //pastebin.com/ZEK3CTdJ

因此,检测到登录提交,但无论如何都会执行原始过滤器链而不是重定向到/unauthorized

我难住了。非常感谢您的帮助,如果您需要更多信息,请告诉我。

4

1 回答 1

3

我想我看到两个问题:

1)您的 spring xml 的 pastebin 未显示使用您的领域配置的 SecurityManager。即它需要看起来像这样:

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
    <property name="realm" ref="myRealm"/>
</bean>

2) 你正在设置一个 Spring MVC 控制器来执行身份验证,这意味着你想要控制何时subject.login被调用,而不是依赖于 Shiro 的内置 FormAuthenticationFilter ( authc)。

如果这样做,则需要将authc过滤器重新定义为 PassThruAuthenticationFilter

这允许请求“通过”过滤器链到您负责调用 subject.login 的登录视图/控制器

您可以在 spring.xml 中通过设置filters属性并authc用作配置过滤器的名称来执行此操作:

<bean id="passthruAuthcFilter" class="org.apache.shiro.web.filter.authc.PassThruAuthenticationFilter">
    <property name="loginUrl" value="/login"/>
</bean>

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
    ...
   <property name="filters">
       <util:map>
           <entry key="authc" value-ref="passthruAuthcFilter"/>
       </util:map>
   </property>
   ...
</bean>

此外,作为提示,您可能希望使用 Shiro 的 WebUtils 将最终用户重定向到他们最初尝试的 url,然后再重定向到登录。ShiroFormAuthenticationFilter会自动执行此操作,但是当您自己执行登录时,如果需要,您有责任执行此重定向。

例如,在您LoginController的 handlePost 方法中:

subject.login(authcToken);
WebUtils.redirectToSavedRequest(request, response, yourFallbackUrlIfThereIsntASavedRequest);
return null; //tells Spring MVC you've handled the response, and not to render a view
于 2012-04-26T17:48:20.917 回答