草庐IT

Spring Boot 1.3.3 同时使用@EnableResourceServer 和@EnableOAuth2Sso

coder 2023-05-12 原文

我希望我的服务器是 ResourceServer,它可以接受承载访问 token

但是,如果这样的 token 不存在,我想使用 OAuth2Server 来验证我的用户。

我尝试这样做:

@Configuration
@EnableOAuth2Sso
@EnableResourceServer
public class SecurityConfiguration extends WebSecurityConfigurerAdapter{

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().authenticated();
    }
}

但是,在这种情况下,只有 @EnableResourceServer 注释有效。它返回

Full authentication is required to access this resource

并且不要将我重定向到登录页面

我提到 @Order 很重要,如果我添加 @Order(0) 注释, 我将被重定向到登录页面,但是,我无法使用 Http header 中的 access_token 访问我的资源:

Authorization : Bearer 142042b2-342f-4f19-8f53-bea0bae061fc

我怎样才能实现我的目标?我希望它同时使用访问 token 和 SSO。

谢谢~

最佳答案

在同一个请求上同时使用这两种配置是不明确的。可能有一些解决方案,但更清楚地定义单独的请求组:

  • OAuth2Sso:对于来自浏览器的用户,我们希望将他们重定向到 token 的身份验证提供程序
  • ResourceServer:通常用于 api 请求,带有从某处获得的 token (很可能来自同一个身份验证提供程序)

为此,请使用请求匹配器将配置分开:

@Configuration
@EnableResourceServer
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {

    @Bean("resourceServerRequestMatcher")
    public RequestMatcher resources() {
        return new AntPathRequestMatcher("/resources/**");
    }

    @Override
    public void configure(final HttpSecurity http) throws Exception {
        http
            .requestMatcher(resources()).authorizeRequests()
            .anyRequest().authenticated();
    }

}

并从 sso 过滤器链中排除这些:

@Configuration
@EnableOAuth2Sso
public class SsoSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    @Qualifier("resourceServerRequestMatcher")
    private RequestMatcher resources;

    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        RequestMatcher nonResoures = new NegatedRequestMatcher(resources);
        http
            .requestMatcher(nonResoures).authorizeRequests()
            .anyRequest().authenticated();
    }
}

并将你所有的资源放在 /resources/**

当然,在这种情况下,两者都将使用相同的 oauth2 配置(accessTokenUrijwt.key-value 等)

更新1:

实际上您可以通过使用此请求匹配器进行上述配置来实现您的原始目标:

new RequestHeaderRequestMatcher("Authorization")

更新 2: (@sid-morad 评论的解释)

Spring Security 为每个配置创建一个过滤器链。每个过滤器链的请求匹配器按照配置的顺序进行评估。 WebSecurityConfigurerAdapter 默认顺序为 100,ResourceServerConfiguration 默认顺序为 3。这意味着首先评估 ResourceServerConfiguration 的请求匹配器。对于这些配置,可以覆盖此顺序,例如:

@Configuration
@EnableResourceServer
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {

    @Autowired
    private org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfiguration configuration;

    @PostConstruct
    public void setSecurityConfigurerOrder() {
        configuration.setOrder(3);
    }
...
}

 

@Configuration
@EnableOAuth2Sso
@Order(100)
public class SsoSecurityConfiguration extends WebSecurityConfigurerAdapter {
...
}

所以是的,上述示例中的 SsoSecurityConfiguration 不需要请求匹配器。但很高兴知道背后的原因:)

关于Spring Boot 1.3.3 同时使用@EnableResourceServer 和@EnableOAuth2Sso,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37059128/

有关Spring Boot 1.3.3 同时使用@EnableResourceServer 和@EnableOAuth2Sso的更多相关文章

  1. ruby - 使用 ruby​​ gem net-ssh-multi 同时在多个服务器上执行 sudo 命令 - 2

    在previousquestion中我想出了如何在多个服务器上启动经过密码验证的sshsession来运行单个命令。现在我需要能够执行“sudo”命令。问题是,net-ssh-multi没有分配sudo需要运行的伪终端(pty),导致以下错误:[127.0.0.1:stderr]sudo:sorry,youmusthaveattytorunsudo根据documentation,可以通过调用channel对象的方法来分配伪终端,但是,以下代码不起作用:它会生成上面的“notty”错误:require'net/ssh'require'net/ssh/multi'Net::SSH::Mul

  2. ruby-on-rails - Rails 4.1 Devise 3.3 列 users.password 不存在 - 2

    我想通过控制台手动创建一个用户:User.find_or_create_by(email:"user@mail.com",first_name:"Stan",last_name:"Smith",password:"password",password_confirmation:"password",confirmed_at:Time.now)我在过去的项目中多次这样做,但这次没有用。它没有获取Devise密码模型属性,所以这是我得到的错误:PG::UndefinedColumn:ERROR:columnusers.passworddoesnotexist我有Rails4.1.4和Dev

  3. springboot定时任务 - 2

    如果您希望在Spring中启用定时任务功能,则需要在主类上添加 @EnableScheduling 注解。这样Spring才会扫描 @Scheduled 注解并执行定时任务。在大多数情况下,只需要在主类上添加 @EnableScheduling 注解即可,不需要在Service层或其他类中再次添加。以下是一个示例,演示如何在SpringBoot中启用定时任务功能:@SpringBootApplication@EnableSchedulingpublicclassApplication{publicstaticvoidmain(String[]args){SpringApplication.ru

  4. 基于SpringBoot的线上日志阅读器 - 2

    软件特点部署后能通过浏览器查看线上日志。支持Linux、Windows服务器。采用随机读取的方式,支持大文件的读取。支持实时打印新增的日志(类终端)。支持日志搜索。使用手册基本页面配置路径配置日志所在的目录,配置后按回车键生效,下拉框选择日志名称。选择日志后点击生效,即可加载日志。windows路径E:\java\project\log-view\logslinux路径/usr/local/XX历史模式历史模式下,不会读取新增的日志。针对历史文件可以分页读取,配置分页大小、跳转。历史模式下,支持根据关键词搜索。目前搜索引擎使用的是jdk自带类库,搜索速度相对较低,优点是比较简单。2G日志全文搜

  5. springboot使用validator进行参数校验 - 2

    1.依赖导入org.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-validation2.validation常用注解@Null被注释的元素必须为null@NotNull被注释的元素不能为null,可以为空字符串@AssertTrue被注释的元素必须为true@AssertFalse被注释的元素必须为false@Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值@Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值@D

  6. 停车系统源码-基于springboot+uniapp开源项目 - 2

    Iparking停车收费管理系统-可商用介绍Iparking是一款基于springBoot的停车收费管理系统,支持封闭车场和路边车场,支持微信支付宝多种支付渠道,支持多种硬件,涵盖了停车场管理系统的所有基础功能。技术栈Springboot,MybatisPlus,Beetl,Mysql,Redis,RabbitMQ,UniApp功能云端功能序号模块功能描述1系统管理菜单管理配置系统菜单2系统管理组织管理管理组织机构3系统管理角色管理配置系统角色,包含数据权限和功能权限配置4系统管理用户管理管理后台用户5系统管理租户管理多租户管理6系统管理公众号配置租户公众号配置7系统管理操作日志审计日志8系统

  7. 什么是SSO? - 2

    SSO(SingleSignOn)单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务整合的解决方案之一。当用户第一次访问应用系统1的时候,因为还没有登录,会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行身份校验,如果通过校验,应该返回给用户一个认证的凭据--ticket;用户再访问别的应用的时候就会将这个ticket带上,作为自己认证的凭据,应用系统接受到请求之后会把ticket送到认证系统进行校验,检查ticket的合法性。如果通过校验,用户

  8. ruby-on-rails - 如何在 Rails/ActiveRecord 中同时使用多个聚合函数? - 2

    我想同时执行多个聚合函数,例如获取按状态分组的最大和最小id:Model.maximum(:id).minimum(:id).group(:status)这行不通(至少对于Rails3.1.1是这样)——你在最小调用时收到一个错误,说它没有在Fixnum上定义。NoMethodError:undefinedmethod`minimum'for22377:Fixnum我可以为它做原始sql-但只是想知道是否有更高级别/Rails选项...谢谢,克里斯 最佳答案 我有一个类似的问题,我在Rails4中使用groupwithpluck解决

  9. ruby-on-rails - 用于 Ruby on Rails 的 SAML 2.0 SSO? - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭6年前。Improvethisquestion我在哪里可以找到用于SAML2.0SSO的Ruby或RubyonRails库。我有一组要构建的企业应用程序,但需要从中央身份验证系统进行联合登录。我在Microsoft.Net环境中使用过SAML1.1和SAML2.0,但还没有看到一个库可以处理RubyonRails的SAML提供者和消费者。有人可以指出我正确的方向或告诉我是否需要自己构建图书馆吗?

  10. ruby - 如何同时使用 splat 和可选哈希在 ruby​​ 中定义方法? - 2

    这个问题在这里已经有了答案:Optionalargumentaftersplatargument(6个答案)关闭8年前。我可以这样定义一个方法:deftest(id,*ary,hash_params)#Dostuffhereend但这使得hash_params参数成为强制性的。这些也不起作用:deft(id,*ary,hash_params=nil)#SyntaxError:unexpected'=',expecting')'deft(id,*ary,hash_params={})#SyntaxError:unexpected'=',expecting')'有没有办法让它成为可选的?

随机推荐