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

使用Spring boot预授权和自定义AuthenticationFilter

燕扬
2023-03-14

我有自定义的身份验证筛选器,它创建PreAuthenticatedAuthenticationToken并将其存储在安全上下文中。过滤器工作良好,它创建具有相应授权权限的令牌“role_user”和“role_adminuser”。这是我的配置:

@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        X509AuthenticationFilter filter = new X509AuthenticationFilter()
        filter.setAuthenticationManager(authenticationManager())
        http.addFilterAfter(filter, SecurityContextPersistenceFilter.class)
        http.authorizeRequests().anyRequest().permitAll()
    }

    @Bean
    public FilterRegistrationBean filterRegistrationBean() {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean()
        X509AuthenticationFilter filter = new X509AuthenticationFilter()
        filter.setAuthenticationManager(authenticationManager())
        registrationBean.setFilter(filter)
        registrationBean.setEnabled(false)
        return registrationBean
    }

我将在SecurityContextPersistenceFilter之前插入过滤器,如:Spring security and custom AuthenticationFilter with Spring Boot所述。

但是,当我试图向controller方法添加预授权注释时,这似乎可以很好地工作,如下所示:

@Controller
@RequestMapping("/security")
class SecurityController {

    @RequestMapping("/authenticate")
    @PreAuthorize("hasRole('ROLE_user')")
    @ResponseBody
        ResponseEntity<String> authenticate(HttpServletRequest request,     Principal principal) {
        println "authenticate: " +     SecurityContextHolder.getContext().getAuthentication()

        return new ResponseEntity<String>(getPreAuthenticatedPrincipal(request), HttpStatus.OK)
    }

我得到一个404错误。如果我注释掉了PreAuthorize注释,方法调用就会正常工作,您可以看到我打印出了身份验证信息,通过身份验证的用户具有ROLE_user和ROLE_adminuser作为其授予的权限。我不确定我做错了什么。

下面是当“preauthorize”被注释掉时,主体中的authorization对象的打印:

authenticate:org.springframework.security.web.authentication.preauthenticatedauthenticationtoken@817a0240:principal:org.springframework.security.ldap.userdetails.ldapuserdetailsimpl@c279eab8:dn:uid=1,ou=people,dc=cdpe,dc=mil;用户名:xxxx@gmail.com;密码:[受保护];已启用:true;AccountNonExpired:true;CredentialsNonExpired:true;AccountNonLocked:true;授予的权限:ROLE_adminuser,ROLE_USER;全权证书:[受保护];已认证:真实;详细信息:org.springframework.security.web.authentication.webauthenticationdetails@957e:RemoteIpAddress:127.0.0.1;SessionID:null;授予的权限:ROLE_adminuser,ROLE_user权限:[ROLE_adminuser,ROLE_user]

更新:我有一点进步。我将proxyTargetClass添加到以下注释中:

 @EnableGlobalMethodSecurity(prePostEnabled = true, proxyTargetClass = true)

现在,当我调用我的方法时,我得到了403个禁止返回。我不知道那是怎么回事。

共有1个答案

阴元青
2023-03-14

Spring Security配置起来一直很繁琐,唯一万无一失的方法是:

  • 要么成为这方面的专家,并准备好查找源代码,然后您就可以手工完成困难的事情
  • 或尽可能使用框架提供的内容,尽可能使用文档中的示例

对于X509AuthenticationFilter的配置,HttpSecurityjavadoc给出了X509方法,其示例如下(根据您的配置进行了修改-参见javadoc获得原始配置):

@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {    

     @Override
     protected void configure(HttpSecurity http) throws Exception {
         http
             .authorizeRequests().anyRequest().permitAll()
             // Example x509() configuration
             .x509();
     }
 }

方法返回x509configureer以进行进一步的自定义

除非你有一个很好的理由去做不同的事情(如果是这样的话,请说出来),我强烈建议你坚持那种方法。

但是在控制器上使用前/后注释实在是一个坏主意,因为在httpsecurity配置中可以直接完成这些操作。它迫使您使用proxyTargetClass=true

 类似资料:
  • 我目前正在使用Spring Security开发Spring Boot REST应用程序。我的工作场所使用Auth0(提供用户管理的外部第三方服务)进行身份验证,并已要求我在此应用程序中实现它。身份验证发生在用React编写的前端应用程序中。前端应用程序显示登录表单,并将用户名和密码发送给Auth0,Auth0验证凭据,并在验证用户时返回JWT令牌。 在此之后,前端应用程序将通过头中的JWT令牌从

  • 功能说明 目睹直播提供了一系列的授权观看方式,如密码验证,付费观看等,然而由于客户业务的多样性,实现如:接入客户自身账户体系,登陆OA系统后再跳转到目睹观看直播等一系列更高级的授权观看方式,此时就需要使用自定义授权。 自定义授权逻辑图 功能设置 首先,需在 某个频道 - 频道管理 - 授权观看 - 授权类型 中点击自定义授权,并输入您希望在观众进入观看页时跳转的链接,如: http://your-

  • 技术栈在前端是reactJS,后端由APIGateway和Lambda供电。我正在使用Auth0作为我的react应用程序中的身份服务。通过Auth0提供的一个社交登录进行身份验证时,我会返回、和。此外,我可以使用获取用户信息,例如。现在,我需要保护/阻止对我的后端即APIGateway和lambda的访问。 有很多选项来保护对AWS APIGateway的访问,如IAM授权器、自定义授权器。有一

  • 我正在寻找如何使用以下设置测试Spring Boot REST API的方法: _ _ 我的测试用例: _ 不幸的是,我在测试中得到以下响应: 在请求之后,我还调试了不同的spring过滤器,其中SecurityContext身份验证为null,随后切换为AnonymousAuthenticationToken 我不知道为什么SecurityContext在请求后为null,而不是用@WithCu

  • 我目前正在做一个需要自定义身份验证过程的项目。该应用程序将部署在AWS平台上,我正在考虑使用以下AWS服务,如 API网关 定制授权 EKS 计划是在docker容器中部署所有后端服务,并使用EKS服务进行容器编排过程。所有输入请求都将通过API网关进行验证,并路由到相应的后端服务 我们将通过以下可能的步骤使用自定义授权流程: 我们的应用程序(例如CHILD-APP)将与现有应用程序(例如PARE

  • null 我尝试将@priority(interceptor.priority.platform_beform)和@prematching也放入我的过滤器中,但即使是在OIDC启动后也会调用。 另外,是否有任何方法支持扩展quarkus oidc逻辑以包括自定义代码? 我无法获得oidc和keycloak-auth拦截器的优先级(知道这些可以帮助我决定过滤器的优先级)。请帮忙。