Spring Security未授权
我一直在遵循一个指南,但我无法让Spring Security工作。 它看起来像是在进行身份验证,但没有进行授权或相反,或者没有重定向到登录成功页面。也许这是个愚蠢的错误,但我看不出来 我的spring安全配置:Spring Security未授权,spring,spring-security,Spring,Spring Security,我一直在遵循一个指南,但我无法让Spring Security工作。 它看起来像是在进行身份验证,但没有进行授权或相反,或者没有重定向到登录成功页面。也许这是个愚蠢的错误,但我看不出来 我的spring安全配置: @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private Environment en
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private Environment env;
@Autowired
private UserSecurityService userSecurityService;
private static final String[] PUBLIC_MATCHERS = {
"/webjars/**",
"/css/**",
"/js/**",
"/images/**",
"/",
"/about/**",
"/contact/**",
"/error/**/*",
"/h2-console/**"
};
@Override
protected void configure(HttpSecurity http) throws Exception {
List<String> activeProfiles = Arrays.asList(env.getActiveProfiles());
// Required by h2 console to work
if(activeProfiles.contains("dev")) {
http.csrf().disable();
http.headers().frameOptions().disable();
}
http
.authorizeRequests()
.antMatchers(PUBLIC_MATCHERS).permitAll()
.anyRequest().authenticated()
.and()
.formLogin().loginPage("/login").defaultSuccessUrl("/payload")
.failureUrl("/login?error").permitAll()
.and()
.logout().permitAll();
}
@Autowired
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userSecurityService);
}
}
日志:
调试o.s.s.w.a.i.FilterSecurityInterceptor-以前经过身份验证:org.springframework.security.authentication。AnonymousAuthenticationToken@2dafa81d:委托人:匿名用户;凭据:[受保护];认证:正确;详细信息:org.springframework.security.web.authentication。WebAuthenticationDetails@2cd90:RemoteIP地址:0:0:0:0:0:0:0:0:1;会话ID:0D60174BBA25377F65443D95DB72F713;授予的权限:角色\u匿名
调试o.s.s.access.vote.AffirmativeBased-投票者:org.springframework.security.web.access.expression。WebExpressionVoter@7a27baf6,返回时间:1
调试o.s.s.w.a.i.FilterSecurityInterceptor-授权成功
调试o.s.s.w.a.i.FilterSecurityInterceptor-RunAsManager未更改身份验证对象
调试o.s.security.web.FilterChainProxy-/js/scripts.js到达附加过滤器链的末尾;继续使用原始链
调试o.s.s.w.c.HttpSessionSecurityContextRepository-SecurityContext为空或内容为匿名-上下文将不会存储在HttpSession中
调试o.s.s.w.a.例外TranslationFilter-链处理正常
调试o.s.s.w.c.SecurityContextPersistenceFilter-随着请求处理完成,SecurityContextHolder现在已清除
调试o.s.s.w.c.HttpSessionSecurityContextRepository-SecurityContext为空或内容为匿名-上下文将不会存储在HttpSession中
调试o.s.s.w.a.例外TranslationFilter-链处理正常
调试o.s.s.w.c.SecurityContextPersistenceFilter-随着请求处理完成,SecurityContextHolder现在已清除
在身份验证期间,应用程序抛出以下错误:
java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
引发此异常,因为提供的纯文本密码缺少密码编码器{id}-前缀。Spring Security 5现在使用以下格式存储密码—以前版本的Spring Security并非如此:
{id}encodedPassword
这意味着对于纯文本密码,{noop}id告诉spring使用NoOpPasswordEncoder匹配密码,NoOpPasswordEncoder基本上将密码作为纯文本处理
然而,存储纯文本密码是非常不鼓励的,尽管它可能对自动化测试有用
改用密码编码器
强烈建议使用BCryptPasswordEncoder、Pbkdf2PasswordEncoder或SCryptPasswordEncoder
BCryptPasswordEncoder
安全配置
对密码进行编码
支持多个编码器
要支持多个编码器,可能需要查看和
有关更多详细信息,请查看验证期间应用程序抛出以下错误:
java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
引发此异常,因为提供的纯文本密码缺少密码编码器{id}-前缀。Spring Security 5现在使用以下格式存储密码—以前版本的Spring Security并非如此:
{id}encodedPassword
这意味着对于纯文本密码,{noop}id告诉spring使用NoOpPasswordEncoder匹配密码,NoOpPasswordEncoder基本上将密码作为纯文本处理
然而,存储纯文本密码是非常不鼓励的,尽管它可能对自动化测试有用
改用密码编码器
强烈建议使用BCryptPasswordEncoder、Pbkdf2PasswordEncoder或SCryptPasswordEncoder
BCryptPasswordEncoder
安全配置
对密码进行编码
支持多个编码器
要支持多个编码器,可能需要查看和
有关更多详细信息,请查看身份验证过程确实会引发错误。尽管被否决不是我的错,尽管这是合理的,但我认为这个问题可能会对来自spring security的人特别有用,因为身份验证过程确实会抛出错误。虽然被否决的不是我,虽然是合理的,但我认为这个问题可能对来自spring security的人特别有用
@Configuration
class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
PasswordEncoder passwordEncoder;
...
@Autowired
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userSecurityService)
.passwordEncoder(passwordEncoder);
}
}
@Service
class UserService implements UserDetailsService {
private UserRepository userRepository;
private PasswordEncoder passwordEncoder;
UserService(UserRepository userRepository, PasswordEncoder passwordEncoder) {
this.userRepository = userRepository;
this.passwordEncoder = passwordEncoder;
}
User createUser(String username, String password) {
// encrypt the plain-text password
String encodedPassword = passwordEncoder.encode(password);
User user = new User(username, encodedPassword));
//...
return userRepository.save(user);
}
}