我需要使用oauth2服务创建授权。我需要从中获取令牌,而不是在访问资源时使用此令牌(REST服务)。我怎么能做到这一点?起点是什么?看到例子会很有意思。
答案 0 :(得分:1)
此处有大量样本:https://github.com/spring-projects/spring-security-oauth/tree/master/samples和此处:https://github.com/spring-projects/spring-security-oauth/tree/master/tests/annotation。
答案 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&client_id=acme&scope=internal&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:
希望这会对某人有所帮助。
卢瓦克