可以在Spring Security中共存OAuth2和基于会话的身份验证吗?

时间:2014-08-25 15:56:00

标签: spring-security oauth-2.0 spring-security-oauth2

我有一个Web应用程序,它使用Spring安全性进行基于会话的登录,使用以下安全应用程序上下文xml进行用户名和密码验证。

<global-method-security pre-post-annotations="enabled" />
<http pattern="/css/**" security="none" />
<http pattern="/files/**" security="none" />

<http auto-config='true' entry-point-ref="authenticationEntryPoint" access-decision-manager-ref="accessDecisionManager">
    <intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" method="OPTIONS" />
    <intercept-url pattern="/login/*" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <intercept-url pattern="/login" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <intercept-url pattern="/**" access="REGISTERED" />
    <form-login login-page="/login" login-processing-url="/login_security_check" authentication-failure-handler-ref="xxxAuthenticationFailureHandler" authentication-success-handler-ref="xxxAuthenticationSuccessHandler" />
    <logout invalidate-session="true" logout-url="/data/logout" success-handler-ref="xxxLogoutSuccessHandler" />
    <remember-me key="xxxRem" />
</http>
<beans:bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased">
    <beans:property name="decisionVoters">
        <beans:list>
            <beans:ref bean="roleVoter" />
            <beans:ref bean="authenticatedVoter" />
        </beans:list>
    </beans:property>
</beans:bean>
<beans:bean id="roleVoter" class="org.springframework.security.access.vote.RoleVoter">
    <beans:property name="rolePrefix" value="" />
</beans:bean>
<beans:bean id="authenticatedVoter" class="org.springframework.security.access.vote.AuthenticatedVoter">
</beans:bean>

<beans:bean id="userDetailsService" class="com.xxx.web.security.XXXUserDetailsService">
</beans:bean>

<authentication-manager alias="authenticationManager">
    <authentication-provider user-service-ref='userDetailsService'>
        <password-encoder hash="md5">
            <salt-source user-property="username" />
        </password-encoder>
    </authentication-provider>
</authentication-manager>

<beans:bean id="loginUrlAuthenticationEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
    <beans:constructor-arg value="/login" />
</beans:bean>
<beans:bean id="authenticationEntryPoint" class="org.springframework.security.web.authentication.DelegatingAuthenticationEntryPoint">
    <beans:property name="defaultEntryPoint" ref="loginUrlAuthenticationEntryPoint" />
</beans:bean>

现在我想为移动应用程序公开我的Web服务,所以我希望实现OAuth2。我已经阅读了github上提供的示例。

我想知道这两个安全流如何共存,因为拦截网址模式对于两个流都是相同的?

1 个答案:

答案 0 :(得分:0)

您需要更改UI和OAuth资源之间共享资源的access=""规则。这两个人真的交叉并不是很常见,但我想对于简单的应用程序,它可能通过内容协商。在XML中使用SpEL支持(或切换到Java配置)可能最容易。例如:

<intercept-url pattern="/** access="isFullyAuthenticated() or #oauth2.hasScope('read')"/>

对于替代方法,您可以为端点创建别名,并使用单独的过滤器链保护它们,一个用于令牌,另一个用于基于cookie的身份验证。例如:

@RequestMapping({ "/user", "/api/user" })
public Map<String, String> user(Principal principal) {
    Map<String, String> map = new LinkedHashMap<>();
    map.put("name", principal.getName());
    return map;
}

其中“/ user”作为普通资源受保护(即在Java配置中使用WebSecurityConfigurerAdapter),并且“/ api / user”是单独配置的(即在Java配置中使用ResourceServerConfigurerAdapter