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

403在Spring靴架上引入授权时禁止

朱慈
2023-03-14

我的第一个Spring开机项目。我确实成功地将其配置为检查身份验证;如果用户/密码错误,则不会调用该方法(状态401 unauthorized),如果正确,则会成功。

现在我已经添加了JSR250的授权,我只得到403访问被拒绝。

WS:

@RestController
@RequestMapping("/password")
public class ServicioPassword {
    @GetMapping(path = "ldap")
    public ResponseEntity<String> getLdap() {
        var authentication = SecurityContextHolder.getContext().getAuthentication();
        System.out.println("EN LDAP " + authentication.getPrincipal() + " - " + authentication.isAuthenticated());
        for (var authority : authentication.getAuthorities()) {
            System.out.println("Authority= " + authority);
        }
        return ResponseEntity.ok("DE LDAP");
    }

调用时,我会在控制台上看到:

EN LDAP LdapUserDetailsImpl[Dn=cn=ivr\u apl\u user,ou=ivr,ou=Aplicaciones,dc=pre,dc=aplssib;用户名=ivr\u apl\u user;密码=[受保护];启用=真;AccountNoExpired=true;CredentialsNonExpired=真;AccountNonLocked=true;授予的权限=[AGNI\u OIMIVR]-true
权限=AGNI\u OIMIVR

然而,如果我添加@RolesAllowed(“AGNI\u OIMIVR”),当我调用它时,我得到一个403禁止。

方法安全配置:

@Configuration
@EnableGlobalMethodSecurity(jsr250Enabled = true, prePostEnabled = true)
public class MethodSecurityConfig
    extends GlobalMethodSecurityConfiguration{   
}

我保留了Web安全配置:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig {

@Configuration
@EnableWebSecurity
public class WebSecurityConfig {

    @Autowired
    private Environment environment;

    @Bean
    BindAuthenticator bindAuthenticator(
        final BaseLdapPathContextSource contextSource) {
        var bindAuthenticator = new BindAuthenticator(contextSource);
        bindAuthenticator.setUserDnPatterns(new String[]{environment.getRequiredProperty("spring.ldap.userdnpattern")});
        return bindAuthenticator;
    }

    @Bean
    AuthenticationProvider ldapAuthenticationProvider(
        final LdapAuthenticator ldapAuthenticator) {
        var ldapAuthenticationProvider = new LdapAuthenticationProvider(ldapAuthenticator);
        var ldapUserDetailsMapper = new CustomUserDetailsMapper();
        var ldapMemberRoles = environment.getRequiredProperty("spring.ldap.roleattributes");
        ldapUserDetailsMapper.setRoleAttributes(ldapMemberRoles.split(","));
        ldapUserDetailsMapper.setRolePrefix("");
        ldapAuthenticationProvider.setUserDetailsContextMapper(ldapUserDetailsMapper);
        return ldapAuthenticationProvider;
    }

    @Bean
    SecurityFilterChain filterChain(
        final HttpSecurity http)
            throws Exception {
        http.csrf().disable()
            .cors().disable()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER).and()
            .authorizeRequests()
            .anyRequest().authenticated().and()
            .httpBasic();

        return http.build();
    }

更新:在设置日志后添加日志。数量组织。springframework。安全=跟踪:

请注意,行:2022-07-07 13:04:27.464 WARN 81968---[nio-8080-exec-2]e.s.d.o.s.ws。CustomUserDetailsMapper:createAuthority agni\u oimivr来自我的一个自定义类的日志。

org.springframework.security.access.AccessDeniedException: Acceso denegado
atorg.springframework.security.access.vote.AffirmativeBased.decide(AffirmativeBased.java:73)~[spring-security-core-5.7.1.jar: 5.7.1]
atorg.springframework.security.access.intercept.AbstractSecurityInterceptor.attempt授权(AbstractSecurityInterceptor.java:239)~[spring-security-core-5.7.1.jar: 5.7.1]
[...]
2022-07-07 13:04:27.497DEBUG 81968---[nio-8080-exec-2]o.s.s.w.access.AccessDeniedHandler Impl:响应403状态码

我做错了什么?


共有1个答案

郁光熙
2023-03-14

经过身份验证的用户的身份验证对象是:

UsernamePasswordAuthenticationToken [Principal=LdapUserDetailsImpl [Dn=cn=ivr_apl_user,ou=IVR,ou=Aplicaciones,dc=pre,dc=aplssib; Username=ivr_apl_user; Password=[PROTECTED]; Enabled=true; AccountNonExpired=true; CredentialsNonExpired=true; AccountNonLocked=true; Granted Authorities=[AGNI_OIMIVR]], Credentials=[PROTECTED], Authenticated=true, Details=WebAuthenticationDetails [RemoteIpAddress=0:0:0:0:0:0:0:1, SessionId=null], Granted Authorities=[AGNI_OIMIVR]] 

请注意,授权权限授权权限=[AGNI\u OIMIVR],那里没有前缀。当您将@RolesAllowed(“AGNI\u OIMIVR”)添加到方法中时,角色前缀将自动添加到您作为注释参数传递的权限中,成为角色AGNI\u OIMIVR。

Spring Security将尝试将批注中的角色与授予权限的属性中的角色匹配,但它们不匹配。

您有三种选择:

  1. 更改LDAP中的角色,使其具有前缀
  2. 公开GrantedAuthorityDefaults的Bean,删除rolePrefix,如下所示:
@Bean
GrantedAuthorityDefaults grantedAuthorityDefaults() {
    return new GrantedAuthorityDefaults("");
}

另一个提示是使用新的@EnableMachodSecurity(jsr250Enable=true),它使用简化的AuthorizationManagerAPI,改进日志记录等。

 类似资料:
  • 我有我的spring boot应用程序,我正在尝试添加Spring Security性,但当我通过postman发出请求时,我不断收到一个403 Forbbiden,联机时我发现我应该在我的配置中添加:“.csrf().disable()”,但它不起作用(如果我在permitAll()中放置路径为:“person/**”的方法,则所有操作都有效) 这是我的代码: 我的用户控制器: My perso

  • 我正在练习使用spring boot来处理restful应用程序 我已经设置了@RestController和@Entity这样 和 当我用邮递员http://localhost:8080/cardatabase/api/cars我有一张汽车清单 但即使我去http://localhost:8081/cardatabase/cars,顶部嵌入 正常吗? 谢谢

  • 我收到了明显臭名昭著的apache 2禁止错误#403,我尝试遵循有关该主题的指南,但似乎都不起作用。我使用的是Ubuntu Server和Apache 2.4.41 我的网站结构类似于/var/www/html/index.html 我的apache2.conf[/etc/apache2/apache2.conf]: 我的vhosts.conf[/etc/apache2/站点可用/000-def

  • 我想暂时禁用整个应用程序的Spring Security性,但我总是被403禁止 删除控制器中的@PreAuthorize注释不会给出任何结果。未使用此注释标记的endpoint也会丢弃我 403 禁止 我不需要基本身份验证 我不需要身份验证 我的Spring Security配置:(/,/api/**,/**,**不工作,我总是得到403禁止) 我的一个控制者:

  • 我无法理解从phonegap发送ajax请求时,如果没有使用tomcat处理请求,则返回403错误。如果使用码头嵌入工作冷却。 我的控制器 如何在tomcat中完整记录请求,或者如何从spring修复它。在简单的rest中,客户机工作很酷。 获取返回 主机10.0.0.42:8080连接保持活动接受/x请求-使用com。柠檬酸。planReview用户代理Mozilla/5.0(Linux;U;A

  • 我正在尝试使用Spring security保护我的网站,但我一直收到