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

在Spring Boot OAuth2授权服务器中使用Active Directory身份验证

蒋茂
2023-03-14

我正在尝试使用Spring Boot和OAuth2进行概念验证。我设立了一些项目,与这里概述的项目非常相似:

https://spring.io/guides/tutorials/spring-boot-oauth2/

这里:https://spring.io/guides/tutorials/spring-security-and-angular-js/

与我的主要区别是我遗漏了所有AngularJS的东西。

我有以下服务:

  • 授权服务器
  • 资源服务器(作为受保护的OAuth2客户端)
  • UI服务器(作为受保护的OAuth2客户端)

我想做的就是:

  1. 点击UI服务器
  2. 重定向到身份验证服务器并提示输入凭据
  3. 然后,UI服务器将从资源服务器获取一些文本并显示它们

我可以在auth服务器上使用基本身份验证使这一切正常工作。但是,我希望能够将基本身份验证替换为来自Active Directory的身份验证。

我有几个其他的SpringBoot项目可以做广告认证,它可以工作,但是每当我尝试把它放到这个项目中时,就会出错。我认为这与auth服务器endpoint的安全性有关,但我不确定是什么。

此外,我还不清楚哪些endpoint应该由什么协议保护(OAuth2 v.基本)在正式生产环境中?文档建议使用Basic保护一些endpoint。所有的OAuth2客户端都应该在请求中包含这些凭据吗?

下面是我的auth server应用程序(添加了用于Active Directory的位):

@EnableResourceServer
@EnableAuthorizationServer
@SpringBootApplication
@RestController
public class AuthServerLdapApplication {

public static void main(String[] args) {
    SpringApplication.run(AuthServerLdapApplication.class, args);
}

@RequestMapping("/user")
public Principal user(Principal user) {
    return user;
}

@Order(ManagementServerProperties.ACCESS_OVERRIDE_ORDER)
@Configuration
protected static class ActiveDirectoryConfig extends WebSecurityConfigurerAdapter {

    @Value("${activedirectory.url}")
    private String activeDirectoryUrl;

    @Value("${activedirectory.domain}")
    private String getActiveDirectoryDomain;

    @Autowired private AuthenticationManager authenticationManager;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider(getActiveDirectoryDomain,
                activeDirectoryUrl);
        provider.setConvertSubErrorCodesToExceptions(true);
        provider.setUseAuthenticationRequestCredentials(true);

        auth.authenticationProvider(provider);
        auth.parentAuthenticationManager(authenticationManager);
    }
}

}

基本上,当我点击UI服务器时,会得到这样的结果:

<oauth>
  <error_description>
    Full authentication is required to access this resource
  </error_description>
  <error>unauthorized</error>
</oauth>

如果对授权服务器执行此操作:

curl -v http://localhost:9004/uaa/login
*   Trying ::1...
* Connected to localhost (::1) port 9004 (#0)
> GET /uaa/login HTTP/1.1
> Host: localhost:9004
> User-Agent: curl/7.44.0
> Accept: */*
>
< HTTP/1.1 401 Unauthorized
< Server: Apache-Coyote/1.1
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: 0
< X-Frame-Options: DENY
< Cache-Control: no-store
< Pragma: no-cache
< WWW-Authenticate: Bearer realm="null", error="unauthorized",    error_description="Full authentication is required to access this resource"
< Content-Type: application/json;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Tue, 01 Dec 2015 12:38:53 GMT
<
{"error":"unauthorized","error_description":"Full authentication is required to access this resource"}* Connection #0 to host localhost left intact

看起来登录endpoint现在需要一个承载令牌?我不知道现在该怎么办。。。

如有任何帮助/建议,将不胜感激。。。

共有1个答案

鲁向明
2023-03-14

@EnableResourceServer,但您没有为要保护的资源提供任何规则,因此它正在尝试保护所有内容。您需要添加类型为ResourceServerConfigurerAdapter@Bean,并设置请求匹配器(以及您需要的任何其他规则)。

 类似资料:
  • 我们正在尝试找出IPC身份验证和授权的最佳实践。我会解释的。我们有一个基于微服务的体系结构SaaS和一个专门的认证服务。该服务负责执行身份验证和管理身份验证令牌(JWT)。 现在的问题是如何验证和授权由其他服务发起的请求(没有特定用户的上下文)? 我们是否应该为每个服务生成一个专用用户,并像对待系统中的任何其他用户一样对待它(具有适当的权限)? 我们是否应该在服务之间部署“硬编码”/动态令牌? 还

  • 问题内容: 是否可以在Android应用程序中使用JAAS? 在android API 中,该包的大多数类都在说 旧版安全代码;不使用。 但是,Android上以用户为中心的JAAS可以替代吗?或者,如果我手动部署,可能会起作用吗? 问题答案: JAAS并不真正适用于Android。JAAS为基于Java的应用程序提供了以用户为中心的安全性(身份是通常正在运行应用程序的“用户”,例如LDAP用户I

  • 我有一个移动(本机)和Web应用程序(SPA),它与后端微服务(在核心2.0中开发)对话,以进行身份验证/授权和其他与域相关的功能,该功能已使用Opendi的配置。这两个应用程序都获得了访问令牌。我遇到的问题是,所有微服务都应该接受无记名访问令牌和登录用户的身份验证/授权(中央身份验证服务),在身份验证微服务中生成的访问令牌(开放身份验证2.*)。那么,我在微服务中缺少哪些更改,其中REST AP

  • 以下是不同的情况: 我的微服务A接收通过API网关并携带有效访问令牌的最终用户发起的请求(JWT,其作用域/声明对应于最终用户:用户名、id、电子邮件、权限等)。这个案子没问题。微服务拥有处理请求的所有信息。 第一个问题:如果微服务A需要调用微服务B会发生什么? null null 例如,微服务B中被调用的方法需要用户id才能工作。用户id值可以设置为查询字符串。如果使用用户访问令牌调用该方法,则

  • OAuth术语已经困扰我很久了。OAuth授权是像一些人建议的那样,还是认证? 如果我错了,请纠正我,但我一直认为授权是允许某人访问某个资源的行为,而OAuth似乎没有任何实际允许用户访问给定资源的实现。OAuth实现所讨论的都是为用户提供一个令牌(签名的,有时是加密的)。然后,每次调用都会将该令牌传递到后端服务endpoint,在后端服务endpoint上检查该令牌的有效性,这也不是OAuth的

  • 我有一个已经完成的j2ee(jsf、cdi、jpa)应用程序,它完美地使用了ApacheShiro,它工作得非常好,我喜欢Shiro注释(hasRole、hasPermission等)。 现在,该项目还必须能够通过SiteMinder进行身份验证,我的问题是: 我如何设置一个领域来处理SiteMinder身份验证而不丢失Shiro授权(似乎SiteMinder会在HTTP头中给我用户名和Rolen