当前位置: 首页 > 知识库问答 >
问题:

使用@FrameworkEndpoint的Spring Security性Oaut2注销

杜阳炎
2023-03-14

我试图注销通过撤销access_token像这样:

@FrameworkEndpoint
public class SecurityLogoutController {
  @Autowired
  private ConsumerTokenServices                 consumerTokenServices;

  @DeleteMapping( "/oauth/token" )
  public ResponseEntity<Void> logout( WebRequest request ) {
    String bearer = "bearer";
    String authorizationHeader = request.getHeader( HttpHeaders.AUTHORIZATION );
    log.info( "authorization header: {}", authorizationHeader );
    if ( authorizationHeader != null && StringUtils.containsIgnoreCase( authorizationHeader, bearer ) ) {
        String accessTokenID = authorizationHeader.substring( bearer.length() + 1 );
        log.info( "access_token: {}", accessTokenID );
        consumerTokenServices.revokeToken( accessTokenID );
    }
    return ...;
  }
}

但每次我和邮递员一起发送删除请求时,我都会得到这样的回复:

{
 "timestamp": "2018-05-30T01:09:11.710+0000",
 "status": 401,
 "error": "Unauthorized",
 "message": "Unauthorized",
 "path": "/oauth/token"
}

endpoint在幕后受到Spring Security的保护,我不知道如何以及在哪里保护此endpoint。我不明白的是:为什么客户端要再次进行身份验证,因为要获得它已经验证过的access_token?这对我来说似乎很奇怪。

现在,当我对客户端进行身份验证时,Postman会自动替换授权标题值,并将其设置为基本身份验证。类似于:Basic Y2hpY293YS11aXNlcnZpY2U6Y2aXNlcnZpY2U=

需要一些帮助。。。谢谢

共有1个答案

郎成弘
2023-03-14

这实际上是有道理的,因为已经登录的用户可以使用提供的令牌进行注销。浏览器应用程序肯定会传递客户端id和密码。

就连我也有同样的问题,我也在网上发布了同样的问题。好一种解决方法是使用client_id和secret进行基本身份验证,重要的是传递另一个名为AUTH-TOKEN(或其他)的头,其中包含要删除的实际令牌的值。这是密码

@RequestMapping(method = RequestMethod.DELETE, value = "/oauth/token")
@ResponseBody
public void revokeToken(HttpServletRequest request) {
    String authorization = request.getHeader("AUTH-TOKEN");
    if (authorization != null && authorization.contains("Bearer")) {
                String tokenId = authorization.substring("Bearer".length() + 1);
                System.out.println("tokenId : " + tokenId);
                tokenServices.revokeToken(tokenId);
                //tokenStore.removeRefreshToken(token);   
     }
} 
 类似资料:
  • 我正在学习springsecurity(基于java的配置),我无法使注销正常工作。当我点击注销时,我看到URL更改为http://localhost:8080/logout并获取“HTTP 404-/logout”。登录功能工作正常(即使使用自定义登录表单),但问题是注销,我怀疑重定向的url“localhost:8080/logout”应该类似于“localhost:8808/springte

  • 主要内容:1.入门,2.设置用户名和密码1.入门 1.启动一个SpringBoot项目 2.导入SpringSecurity相关依赖 3.编写Controller TestController.java 用户是user 密码是刚刚的 2.设置用户名和密码 1.在配置文件中设置 2.在配置类中设置 3.自定义实现类 2.1 配置文件中设置 2.2 在配置类中设置 设置用户名为zZZ,密码为root 2.3 自定义实现类 配置类: 业务类:

  • 本文向大家介绍如何使用SpringSecurity保护程序安全,包括了如何使用SpringSecurity保护程序安全的使用技巧和注意事项,需要的朋友参考一下 首先,引入依赖: 引入此依赖之后,你的web程序将拥有以下功能: 所有请求路径都需要认证 不需要特定的角色和权限 没有登录页面,使用HTTP基本身份认证 只有一个用户,名称为user 配置SpringSecurity springsecur

  • 问题内容: 我目前正在评估基于Java的安全框架,我是Spring 3.0用户,因此似乎似乎SpringSecurity是正确的选择,但是Spring安全性似乎受到过分复杂的困扰,它似乎并没有使安全性易于实现, Shiro似乎更加连贯,更容易理解。我正在寻找这两个框架之间的利弊清单。 问题答案: 我也同意Spring Security对我来说感觉太复杂了。当然,他们已经做了一些降低复杂性的事情,例

  • 我正在使用JavaEE6,需要从“.properties”文件加载配置。是否有推荐的方法(最佳实践)来加载这些值​​从配置文件中使用依赖项注入?我在Spring中找到了这方面的注释,但还没有找到JavaEE的“标准”注释。 这家伙从零开始开发了一个解决方案: http://weblogs.java.net/blog/jjviana/archive/2010/05/18/applicaction-c

  • 在WAR的情况下,它试图将请求转发到/error页面,并寻找它的处理程序方法(请参见底部的日志)。 最后我得到以下回应: 我该换什么才能得到401?