我有一个典型的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)完全不触发(意思是,凭据没有检查),并登录总是失败。看起来像重定向页面失去了“挂钩”的领域。
关于我在做什么的错误?
谢谢,Les。我会尝试的。让Shiro“本地”支持X-Forwarded-Proto可能不是最有用的功能(不知道有多少人有类似的情况),但能够设置单独的URL - 一个用于“redirectToLoginURL”,另一个用于“performAuthenticationURL (s)“ - 可能真的有帮助。 – Djam