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

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

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

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

【问题讨论】:

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


    【解决方案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;
    猜你喜欢
    • 2021-09-20
    • 2018-01-17
    • 2016-06-26
    • 1970-01-01
    • 2013-09-25
    • 2013-04-11
    • 2019-09-13
    • 2018-08-13
    • 2012-06-08
    相关资源
    最近更新 更多