Spring MVC应用程序和OAuth2授权

时间:2014-10-13 09:51:35

标签: spring security model-view-controller spring-security-oauth2

我需要使用oauth2服务创建授权。我需要从中获取令牌,而不是在访问资源时使用此令牌(REST服务)。我怎么能做到这一点?起点是什么?看到例子会很有意思。

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

当你在Google中键入SpringMVC OAuth时,第一个SOF问题就是这个问题,现有的答案不是很详细(一切都是通过注释完成的......没有详细说明幕后的内容),尽管问题很老我给出了一个更详细的答案。

要将SpringMVC和OAuth联系在一起,您需要使用通过Oauth对Web应用程序进行身份验证的两个流程之一:密码(或资源所有者密码)流或隐式流程。

使用密码流,您将拥有自己的登录页面(在SpringMVC应用程序中)并将凭据发送到授权服务器(OAuth服务器)以验证它们。授权服务器可以使用Spring Security OAuth构建,也可以是Google one。您可以使用此示例来帮助您实现此目的:https://github.com/skate056/spring-security-oauth2-google您需要配置将使用RestTemplate与授权服务器通信的特定过滤器。

如果您想使用隐式流程(更好的解决方案,因为它更安全:您的应用程序和授权服务器之间没有凭据),它更简单,您可以按照以下基本步骤操作:

Spring安全上下文:

 <http auto-config="true" use-expressions="true">    
<intercept-url pattern="/login.do" access="permitAll"/>
    <intercept-url pattern="/**" access="isAuthenticated()" />

<form-login 
    login-page="http://authserver/uaa/oauth/authorize?response_type=token&amp;client_id=acme&amp;scope=internal&amp;redirect_uri=http://myserver/myappli/login.do" 
    authentication-failure-url="/login.do?login_error=1"  
/>
    <logout logout-url="/logout.do" logout-success-url="/login.do" />
    <custom-filter ref="oauth2ClientContextFilter" after="EXCEPTION_TRANSLATION_FILTER"/>
    <custom-filter ref="oAuth2AuthenticationProcessingFilter" before="FILTER_SECURITY_INTERCEPTOR"/>
</http>

<global-method-security pre-post-annotations="enabled"/>

<beans:bean id="oauth2ClientContextFilter" class="org.springframework.security.oauth2.client.filter.OAuth2ClientContextFilter" />
<beans:bean id="oAuth2AuthenticationProcessingFilter" class="fr.loicmathieu.auth.oauth.ImplicitFlowOAuthProcessingFilter">
    <beans:constructor-arg name="defaultFilterProcessesUrl" value="/register_token"/>
    <beans:property name="authenticationManager" ref="theAuthenticationManager" />
</beans:bean>

身份验证管理器与您的特定应用程序相关,它可以使用获取令牌信息端点从授权服务器加载用户的信息,从LDAP加载用户的信息,如果使用JWT,甚至可以从令牌本身加载

我对ImplicitFlowOAuthProcessingFilter的实现是非常基本的,它从令牌创建一个身份验证对象,然后身份验证对象将由您的AuthenticationProvider用于检索令牌并随意执行任何操作:

public class ImplicitFlowOAuthProcessingFilter extends AbstractAuthenticationProcessingFilter{

    public ImplicitFlowOAuthProcessingFilter(String defaultFilterProcessesUrl) {
        super(defaultFilterProcessesUrl);
    }

    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException{
        String token = request.getParameter("access_token");
        return this.getAuthenticationManager().authenticate(new OAuth2TokenAuthentication(token));
    }

最后一个技巧是登录页面,Spring Security OAuth的Authentication Server的默认实现将访问令牌附加到ULR的#部分,这部分在服务器中不可用,所以我使用了一个登录页面将令牌从#部分移动到access_token请求参数并重定向到register_token URL:

  1. 授权服务器重定向到http://myserver/myapplication/login.do#access_token=
  2. 登录页面,通过JavaScript,读取网址的哈希值并重定向到http://myserver/myapplication/register_token?access_token=
  3. 最后,我的ImplicitFlowOAuthProcessingFilter将读取此参数,获取令牌,构建将由身份验证管理器使用的身份验证对象
  4. 希望这会对某人有所帮助。

    卢瓦克