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

在单个Oauth安全Spring控制器中无法具有安全和非安全endpoint

麻昌翰
2023-03-14
@SpringBootApplication
@EnableOAuth2Resource
public class ProfileApplication extends SpringBootServletInitializer {

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

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(ProfileApplication.class);
    }
}

我面临的挑战是,我找不到一种方法来配置安全性,使到/profilesendpoint的POST请求不受保护,而GET或PUT的请求从提供的承载令牌传递到派生的@AuthenticationPrincipal中。

我想在API中设置以下内容:POST/profile创建新用户-无安全性GET/profile/{id}按id获取用户-需要管理员权限或用户是authd POST/password/reset-启动密码重置-无安全性

我有以下bean来配置安全性

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Order(-10) //SecurityProperties.ACCESS_OVERRIDE_ORDER)
class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override

    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/", "/public/**").permitAll()                
                .antMatchers(HttpMethod.POST, "/profiles/**").permitAll()
                .antMatchers(HttpMethod.GET, "/profiles/**").fullyAuthenticated()
                .antMatchers("/password/**").permitAll()
                .anyRequest().fullyAuthenticated()
                .and()
                .csrf().disable();
    }
}

使用上面的方法,GETendpoint调用失败,出现403错误,没有尝试从令牌查找当前用户,但将通过一个post。查看日志,我在筛选器链中不再看到OAuth2AuthenticationProcessingFilter。我尝试添加一些额外的过滤器似乎导致它不再注册。

此controller方法如下所示:

@RequestMapping(method = {RequestMethod.GET}, value="/profiles/{login:.+}")
@ResponseBody
public ResponseEntity<Profile> get(@AuthenticationPrincipal Principal currentUser, @PathVariable String login) {

如果我将顺序设置为SecurityProperties.Access_Override_Order,则GET请求可以工作,并且我看到基于jwt承载令牌中的配置文件对我的oauth服务进行查找,但对配置文件或密码控制器的POST请求失败,结果为401。因此,代码似乎从未到达这个过滤器,而是被OAuth2AuthenticationProcessingFilter和请求失败的auth截获。

当使用@enableoauth2resource时,是否有一种方法可以部分保护Spring Boot应用程序?我必须设置一个不同的配置bean来提供必要的重写吗?如果是的话,基于什么接口?

共有1个答案

袁赞
2023-03-14

我认为您应该将Oauth2资源从SecurityConfig中的请求匹配器中移走,并允许它们由资源服务器筛选器(扩展ResourceServerConfigurerAdapter的类)处理。

我的回答是受到了Dave Syer的回答的启发,这是在这里给出的。您可以在这里找到一个很好的安全配置。

或者尝试对bean执行更高的命令。

 类似资料:
  • 本任务将演示如何通过使用Istio认证提供的服务账户,来安全地对服务做访问控制。 当Istio双向TLS认证打开时,服务器就会根据其证书来认证客户端,并从证书获取客户端的服务账户。服务账户在source.user的属性中。请参考Istio auth identity了解Istio中服务账户的格式。 开始之前 根据quick start的说明在开启认证的Kubernetes中安装Istio。注意,应

  • 我的应用程序有Spring boot 1.3.2,我正在尝试将Spring MVC与Spring Security结合使用。 我有管理小组http://localhost:8080/admin和我的普通用户页面内容http://localhost:8080/ 如果你试图打开一个管理面板(http://localhost:8080/admin)你必须登录,如果你是常见的只需输入http://loca

  • 我是symfony的新手,正在学习登录表单教程(https://symfony.com/doc/2.8/cookbook/security/form_login_setup.html)但我得到了以下错误: 我使用相同的SecurityController: security.yml 安全:

  • 我正在测试家庭控制器 我使用spring security作为用户名“user”,默认情况下作为密码进行测试,但@PreAuthorize不起作用 的结果 预期结果: 实际结果: 我错过了什么吗?

  • 如何为执行器endpoint启用安全性,当在Spring启动1.5.4.RELEASE项目中没有Spring Security模块依赖项时 我在应用程序中添加了以下值。属性,但当我单击任何endpoint时,我会得到错误 我应该如何启用安全性?

  • 面试总结: 面试岗位:测试工程师 面试日期:2022.11.1 面试时间:约30分钟 面试流程: 一、自我介绍 二、根据项目内容提问了一个相关问题 三、怎么理解软件测试工作?为从事测试行业做了哪些准备? 从开发流程、测试流程上说了软件测试的重要性;简要说明了不同测试阶段的测试用例设计方法(白盒 黑盒等); 准备:学习了测试环境的搭建和一些常用测试工具与测试框架的使用等 四、在linux系统中,如果