2011-09-21 89 views
2

我有一个典型的Spring MVC + GWT体系结构,并且Apache Shiro是一个安全层。当@Controller重定向到登录页面时如何配置Shiro + Spring MVC

问题: 无论使用什么协议向App服务器发送请求,页面都应该以请求的“X-Forwarded-Proto”头中指定的协议返回(所以应用服务器可以接收HTTP请求,但如果标题显示HTTPS,则应使用HTTPS进行响应)。

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> 
    <property name="securityManager" ref="securityManager"/> 
    <property name="loginUrl" value="/login.jsp"/> 
    <property name="filterChainDefinitions"> 
    <value> 
     /** = authc 
    </value> 
    </property> 
</bean> 

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

<bean id="myRealm" class="com.myapp.security.DBRealm"> 
    <property name="credentialsMatcher" ref="sha256Matcher"/> 
</bean> 

可能的解决办法:

显然,在四郎弹簧教程中指定的配置将无法正常工作,因为它没有任何与协议(login.jsp的使用将在请求中使用的协议退还)

使用@Controller重定向到与指定的协议登录视图:

@RequestMapping(value="/login", method=RequestMethod.GET) 
public RedirectView doLogin(HttpServletRequest req) throws MalformedURLException { 
    URL originalURL = new URL(req.getRequestURL().toString()); 
    return new RedirectView(new URL(req.getHeader("X-Forwarded-Proto"), originalURL.getHost(), "/login.jsp").toString()); 
} 

和更改loginUrl在四郎配置为指向/登录,以便@Controller捕获它:

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> 
    <property name="securityManager" ref="securityManager"/> 
    <property name="loginUrl" value="/login"/> 
    ... leave everything else the same 
</bean> 

但有了这个配置,虽然我得到相同的登录页面,则MYREALM(com.myapp.security.DBRealm)完全不触发(意思是,凭据没有检查),并登录总是失败。看起来像重定向页面失去了“挂钩”的领域。

关于我在做什么的错误?

回答

3

这是失败的原因是因为Shiro authc筛选器(a FormAuthenticationFilter)预计loginUrl是发生登录尝试的那个。

也就是说,当authc过滤与loginUrl匹配的请求时,它将自动支持基于表单的身份验证。由于您正在将最终用户重定向至与loginUrl(即loginUrl = /login,但您将其重定向至/login.jsp)不匹配的网址,因此authc过滤器将不会执行登录。

你最好的选择IMO:

子类FormAuthenticationFilter并重写redirectToLogin方法来使用你的X-Forwarded-Proto逻辑。然后重新定义'authc'为您的自定义子类。例如,使用四郎的.ini:

[main] 
    ... 
    authc = com.foo.my.FormAuthenticationFilterSubclass 

另外,如果要直接在四郎这种行为(因此四郎查找执行默认重定向时头),这样你可以删除你的子类,请打开功能请求Apache Shiro's Jira

+0

谢谢,Les。我会尝试的。让Shiro“本地”支持X-Forwarded-Proto可能不是最有用的功能(不知道有多少人有类似的情况),但能够设置单独的URL - 一个用于“redirectToLoginURL”,另一个用于“performAuthenticationURL (s)“ - 可能真的有帮助。 – Djam

相关问题