解决springsecurity中遇到的问题
spring security中遇到的问题
1.An Authentication object was not found in the Security Context
在security上下文中没有找到一个认证对象,我这边的问题在于controller中方法添加了认证注解,但是配置类中
源自于一片我为了解决拦截静态文件的博客,上面说这个忽视目录会以classpath中的static文件夹,实际上这样写有着很大问题,这边会让所有的文件不拦截,虽然你的http认证添加了拦截,但是web这个会影响到效果,所以一边允许所有文件不拦截,一边controller中添加了需要认证的注解,所以你一访问就会进去这个页面,但是进去之后发现在security context并没有这个角色值,所以就会出现这个异常
最后对这个异常说明一句话:这个普通来看就是越过了普通的往上下文中添加了角色但是进去了这个页面就会出现这个错误
2.拦截登录之后总是会进login?error,而且没有提示
这个情况还是有错误提示才会好解决问题,在http认证配置中的FormLoginConfigurer
添加一个failureUrl("/login/error")
,当然这个地址是我们自己定义的,然后对应的congtroller方法:
@RequestMapping(value = "/login/error")
public void loginError(HttpServletRequest request, HttpServletResponse response) {
response.setContentType("text/html;charset=utf-8");
AuthenticationException exception =
(AuthenticationException) request.getSession().getAttribute("SPRING_SECURITY_LAST_EXCEPTION");
try {
response.getWriter().write(exception.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
这样就可以把最基本的错误打印出来,然后我们再根据实际问题进行处理
3.Spring Security BadCredentialsException
这个具体原因还不是很清楚,但是有个很简单的解决办法,把所有的密码加密方式改为相同的,还不可以的话
单独写一个配置类:
@Configuration
public class BeanConfiguration {
@Bean
public PasswordEncoder passwordEncoder(){
return new CustomPasswordEncoder();
}
}
这个CustomPasswordEncoder类是我自己写个一个密码加密类,不想使用的话也可以使用官方推荐的:BCryptPasswordEncoder
springboot用security遇到的问题
如果项目中用了 security ,而不用 security 自带的登入的话 ,会自动跳转其自带的登入界面(前提是已拦截 放开的可以直接访问),/login 自带登入接口路径 ,/logout 自带退出接口路劲。
自定义拦截
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
MyUserDetailsService myUserDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("*.css","*.js","*.jpg","*.gif","*.ico","*.ico","*.woff","*.ttf","*.png").permitAll()
// .antMatchers("/main").hasAnyRole("ANONYMOUS,USER")
.anyRequest().authenticated()
.and().csrf().disable()
//指定支持基于表单的身份验证。如果未指定FormLoginConfigurer#loginPage(String),则将生成默认登录页面
.formLogin() // 此开始
.loginPage("/login") //security 自带登入接口
.permitAll()
.and() //此结束
.headers().frameOptions().disable()
.and()
.rememberMe().tokenValiditySeconds(1209600)
.and()
.logout()
.permitAll();
}
}
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341