自定义springsecurity OAuth 2错误输出问题,怎么解决

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义springsecurity OAuth 2错误输出问题,怎么解决相关的知识,希望对你有一定的参考价值。

参考技术A 改成多少都没事的,主要是看看多少格子数,格子数不会错的,你改的只是用多少布,配线的时候是看的格子数,没什么关系的

自定义 oauth2 令牌请求以接受额外数据

【中文标题】自定义 oauth2 令牌请求以接受额外数据【英文标题】:Customise oath2 token request to accept extra data 【发布时间】:2015-09-18 05:04:09 【问题描述】:

我正在使用 jersey 和 spring-oauth2 和 spring security。我的应用程序在端点“/oauth/token”上运行良好。

我想更改端点以接受更多数据。要求是,我想向令牌 API 发送更多详细信息(即设备详细信息操作系统、手机/平板电脑/网络等)。所以,我想覆盖端点,如果身份验证成功,我想将额外的信息存储在数据库中。

我找不到任何与以这种方式更改 API 相关的内容。 有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

我通过编写包装控制器并分配默认 tokenEndpoint bean 找到了解决方案

@FrameworkEndpoint
public class LoginContrller

private static Logger logger = org.slf4j.LoggerFactory.getLogger(LoginContrller.class);
private WebResponseExceptionTranslator providerExceptionHandler = new DefaultWebResponseExceptionTranslator();

@Autowired
private UserManager userManager;

@Autowired
TokenEndpoint tokenEndPoint;

@RequestMapping(value = "/user/login", method=RequestMethod.POST,consumes=MediaType.APPLICATION_JSON)
public ResponseEntity<OAuth2AccessToken>  postAccessToken(Principal principal, @RequestParam
Map<String, String> parameters,@RequestBody(required=false) LoginModel loginModel) throws HttpRequestMethodNotSupportedException 
    ResponseEntity<OAuth2AccessToken> response = tokenEndPoint.postAccessToken(principal, parameters);
    if(!isRefreshTokenRequest(parameters))
        if(loginModel!=null)
            loginModel.setUsername(parameters.get("username"));
            try 
                userManager.loginUser(loginModel);
             catch (UserNotFoundException e) 
                logger.warn("Exception in custom login  ",e);
            
        
    
    return response;


private boolean isRefreshTokenRequest(Map<String, String> parameters) 
    return "refresh_token".equals(parameters.get("grant_type")) && parameters.get("refresh_token") != null;


private boolean isAuthCodeRequest(Map<String, String> parameters) 
    return "authorization_code".equals(parameters.get("grant_type")) && parameters.get("code") != null;


@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
public void handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) throws Exception 
    logger.info("Handling error: " + e.getClass().getSimpleName() + ", " + e.getMessage());
    throw e;


@ExceptionHandler(Exception.class)
public ResponseEntity<OAuth2Exception> handleException(Exception e) throws Exception 
    logger.info("Handling error: " + e.getClass().getSimpleName() + ", " + e.getMessage());
    return getExceptionTranslator().translate(e);


@ExceptionHandler(ClientRegistrationException.class)
public ResponseEntity<OAuth2Exception> handleClientRegistrationException(Exception e) throws Exception 
    logger.info("Handling error: " + e.getClass().getSimpleName() + ", " + e.getMessage());
    return getExceptionTranslator().translate(new BadClientCredentialsException());


@ExceptionHandler(OAuth2Exception.class)
public ResponseEntity<OAuth2Exception> handleException(OAuth2Exception e) throws Exception 
    logger.info("Handling error: " + e.getClass().getSimpleName() + ", " + e.getMessage());
    return getExceptionTranslator().translate(e);


private WebResponseExceptionTranslator getExceptionTranslator() 
    return providerExceptionHandler;



web.xml 中的更改:只需将 URL 替换为新的 URL

<servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>/user/login</url-pattern>
</servlet-mapping>

最后使用 logincontroller 类创建 bean 并更改 spring-security.xml 中的 URL。

如下改变oauth token url和clientCredentialsTokenEndpointFilter的url。

 <sec:http pattern="/user/login" create-session="stateless" authentication-manager-ref="clientAuthenticationManager" use-expressions="true" >

    <sec:intercept-url pattern="/user/login" access="isFullyAuthenticated()"/>
    <sec:csrf disabled="true"/>
    <sec:anonymous enabled="false" />
    <sec:http-basic entry-point-ref="clientAuthenticationEntryPoint" />
    <sec:custom-filter ref="clientCredentialsTokenEndpointFilter" after="BASIC_AUTH_FILTER" />
</sec:http>
<bean id="clientCredentialsTokenEndpointFilter" class="org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter">
    <constructor-arg value="/user/login"></constructor-arg>
    <property name="authenticationManager" ref="clientAuthenticationManager" />
      <property name="filterProcessesUrl" value="/user/login" />
</bean>
<bean class="com.oauth2.provider.endpoint.LoginContrller" />

【讨论】:

使用java配置注解怎么样? 谁是:UserManager userManager;

以上是关于自定义springsecurity OAuth 2错误输出问题,怎么解决的主要内容,如果未能解决你的问题,请参考以下文章

SpringSecurity+Oauth2.0登录认证+自定义验证

轻松上手SpringSecurity,OAuth,JWT

轻松上手SpringSecurity,OAuth,JWT

自定义SpringSecurity授权跳转地址

自定义SpringSecurity授权跳转地址

Spring Security 5 中使用 oauth2 的自定义登录页面返回 null