使用 Spring Security 时移动和桌面的不同登录页面

Posted

技术标签:

【中文标题】使用 Spring Security 时移动和桌面的不同登录页面【英文标题】:Different Login pages for mobile and desktop while using Spring Security 【发布时间】:2012-03-25 18:47:30 【问题描述】:

我正在使用带有 spring-mvc 的 spring-security web 身份验证,到目前为止一切都很好,但是现在我正在开发我的应用程序的移动版本,为此我为移动站点设计了一组不同的页面,其中包括不同的登录页面。现在我的配置有问题

这是我的 applicationContext-security.xml

    <?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
              http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd">

    <http auto-config="true" lowercase-comparisons="false">
        <intercept-url pattern="/images/**" filters="none" />
        <intercept-url pattern="/Stylesheets/**" filters="none" />
        <intercept-url pattern="/javascript/**" filters="none" />
        <intercept-url pattern="/scripts/**" filters="none" />
        <intercept-url pattern="/favicon.ico" access="ROLE_ANONYMOUS" />
        <intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN"/>
        <intercept-url pattern="/mobile/**" access="ROLE_USER,ROLE_ADMIN"/>
        <form-login login-page="/login.htm" authentication-success-handler-ref="customHandler"
            authentication-failure-url="/login.htm?error=true" default-target-url="/home.htm"
            login-processing-url="/j_security_check"  />
         <remember-me user-service-ref="userDAO" key="e37f4b31-0c46-11dd-bd0b-0800200c9a66"/>
    </http>

    <beans:bean id="customHandler" class="com.example.auth.AuthenticationHandler">
    </beans:bean>

    <authentication-manager>
        <authentication-provider user-service-ref="userDAO">
            <!--
            TODO skipped to allow password emailing instead of password change and security
            TODO question hell..
          -->
           <!--  <password-encoder ref="passwordEncoder"/>  -->
        </authentication-provider>
    </authentication-manager>

</beans:beans>

现在我如何根据不同的请求拥有多个登录页面,我的意思是如果移动文件夹的页面比用户应该显示移动登录页面。 我在 *** 上看到过类似的问题,但这些是根据不同角色的登录页面,但在我的情况下,我想要不同页面的差异登录。

您好,感谢您的解决方案,看来它对我来说可以正常工作。我现在已经切换到 spring security 3.1 但它给了我一个例外。你能帮我解决这个问题吗?

Error creating bean with name 'org.springframework.security.filterChains': Cannot resolve reference to bean 'org.springframework.security.web.DefaultSecurityFilterChain#4' while setting bean property 'sourceList' with key [4]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.web.DefaultSecurityFilterChain#4': Cannot create inner bean '(inner bean)' of type [org.springframework.security.web.authentication.logout.LogoutFilter] while setting constructor argument with key [1]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#6': Cannot resolve reference to bean 'org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices#0' while setting constructor argument with key [1]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices#0': Cannot create inner bean '(inner bean)' while setting bean property 'userDetailsService'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#7': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanInitializationException: Property 'sessionFactory' is required for bean '(inner bean)#7'

【问题讨论】:

【参考方案1】:

如果你有可能切换到spring security 3.1,你可以简单地定义2个http元素1。如果不能切换,则无法完全通过命名空间进行配置,必须注册一个 entry-point-ref 和 somd &lt;sec:custom-filter&gt; 元素。

【讨论】:

嗨,感谢您的解决方案,看来它对我来说可以正常工作。我现在已经切换到 spring security 3.1 但它给了我一个例外。你能帮我解决这个问题吗?【参考方案2】:

您必须提供自定义authentication entry point 并在那里做出决定。这个SO answer 可以作为您可以使用的起点。

【讨论】:

以上是关于使用 Spring Security 时移动和桌面的不同登录页面的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Security 保护移动 REST Api 足够了吗?

从移动设备登录 Spring Security、Rest api 和 Facebook

Spring Security RememberMe & RESTful API

Spring 网站的 Spring Security Oauth2

Spring Security 和 Shiro 该如何选择?

配置 Spring Security 以在认证后返回 JSON 响应