【问题标题】:Obtain the Authentication (Principal) object via oAuth2 Spring Security?通过 oAuth2 Spring Security 获取身份验证(主体)对象?
【发布时间】:2017-10-28 06:48:00
【问题描述】:

因此,当用户通过 oAuth2 环境中的授权服务器在其客户端设备上获得授权的 JWT 后,我一开始想到我可以实现哪个自定义 AuthenticationManager 甚至自定义 AuthenticationProvider 感到困惑。

然后它击中了我,呃,用户不需要通过 AuthenticationManager,因为他们已经通过授权服务器使用系统中实现的任何 oAuth2 流程进行了“身份验证”。他们有 JWT 访问令牌来证明这一点,事实上,他们甚至无法在没有授权访问令牌的情况下访问任何资源服务器端点。

但是,我仍然想要一种访问包含所有用户信息的身份验证对象的方法。

在不使用 AuthenticationManager 的情况下,您将如何创建和获取对此 Authentication 对象的引用?我在这里很困惑。

我想要这个 Authentication 对象的主要原因是因为我计划在 Spring Security 的 ACL 旁边使用带有自定义表达式的方法级安全性。换句话说,我想要 oAuth2 并且我还想要使用 ACL 来非常精细地控制哪些用户对哪些域对象具有授权/权限。

那么,在设置 oAuth2 之后,我如何才能访问此 Authentication 对象(甚至可以使用用户当前的访问令牌作为字段/属性来创建它)?

谢谢。

【问题讨论】:

    标签: java spring spring-mvc spring-security oauth-2.0


    【解决方案1】:

    一个有以下Controller方法:

    @RequestMapping(...)
    Output do(Input input)
    

    您可以将身份验证对象添加到参数中:

    @RequestMapping(...)
    Output do(Input input, Authentication authentication)
    

    Spring 会自动连接这个依赖。 如果你在更深的层/其他类,你可以使用

     SecurityContextHolder.getContext().getAuthentication()
    

    【讨论】:

    • 所以让我理解。使用 oAuth2 和 Spring Security 会自动构造 Authentication 对象,并在 SecurityContextHolder.getContext().setAuthentication() 中设置它?如果为真,那么 1) 它使用什么 AuthenticationManager 实现来执行此操作? 2)如果是AuthenticationProvider实例,它是哪个实现? 3) 幕后的 UserDetailsS​​ervice 实现是检查请求标头中发送的令牌是否有效,然后从数据源中提取属于令牌资源所有者的用户名和其他凭据?
    • 抱歉,前几天没在线。是的,Spring 将根据身份验证令牌的内容自动创建此对象。您通常必须提供自己的 UserDetailsS​​ervice 实现。我在这里做了一个简单的数据库登录和 oauth2 的例子:github.com/miwoe/spring-security 但它没有很好的记录。基于此:github.com/spring-guides/tut-spring-security-and-angular-js
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 2015-04-27
    • 1970-01-01
    • 2018-10-05
    • 2014-09-15
    • 2012-03-06
    相关资源
    最近更新 更多