我的第一个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状态码
我做错了什么?
经过身份验证的用户的身份验证对象是:
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将尝试将批注中的角色与授予权限的属性中的角色匹配,但它们不匹配。
您有三种选择:
更改LDAP中的角色,使其具有前缀
公开GrantedAuthorityDefaults的Bean,删除rolePrefix,如下所示:
@Bean
GrantedAuthorityDefaults grantedAuthorityDefaults() {
return new GrantedAuthorityDefaults("");
}
另一个提示是使用新的
@EnableMachodSecurity(jsr250Enable=true)
,它使用简化的AuthorizationManager
API,改进日志记录等。
我有我的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保护我的网站,但我一直收到