解决spring security中遇到的问题

 更新时间:2023年01月20日 14:03:19   作者:成都犀牛  
这篇文章主要介绍了解决spring security中遇到的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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 {

    /**
     * @return Return to the custom password encryptor.
     * The reason why it is extracted separately as a configuration class is because if you don't do this,
     * you cannot achieve unified password encryption, which leads to login failures.
     * Different password encryption results in different passwords.
     */
    @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();
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解Java的MyBatis框架中的事务处理

    详解Java的MyBatis框架中的事务处理

    利用MyBatis框架的配置管理比直接使用JDBC API编写事务控制要来得更加轻松,这里我们就来详解Java的MyBatis框架中的事务处理,尤其是和Spring框架集成后更加exciting
    2016-06-06
  • Java实现二分查找算法实例分析

    Java实现二分查找算法实例分析

    这篇文章主要介绍了Java实现二分查找算法,实例分析了二分查找算法的原理与相关实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • 解析Java 泛型什么情况下不能使用

    解析Java 泛型什么情况下不能使用

    这篇文章主要介绍了解析Java 泛型什么情况下不能使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • SpringBoot深入分析讲解监听器模式下

    SpringBoot深入分析讲解监听器模式下

    监听器模式,大家应该并不陌生,主要的组成要素包括了事件、监听器以及广播器;当事件发生时,广播器负责将事件传递给所有已知的监听器,而监听器会对自己感兴趣的事件进行处理
    2022-07-07
  • Java实现常用的三种加密算法详解

    Java实现常用的三种加密算法详解

    编程中常见的加密算法有以下几种:信息摘要算法、对称加密算法以及非对称加密算法。本文将利用Java实现这几种常见的加密算法,需要的可以参考一下
    2022-03-03
  • java compare compareTo方法区别详解

    java compare compareTo方法区别详解

    本文主要介绍了java compare compareTo方法区别,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • SpringBoot集成P6Spy实现SQL日志的记录详解

    SpringBoot集成P6Spy实现SQL日志的记录详解

    P6Spy是一个框架,它可以无缝地拦截和记录数据库活动,而无需更改现有应用程序的代码。一般我们使用的比较多的是使用p6spy打印我们最后执行的sql语句
    2022-11-11
  • Java实现一个简单的文件上传案例示例代码

    Java实现一个简单的文件上传案例示例代码

    这篇文章主要介绍了Java实现一个简单的文件上传案例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Java中的ThreadPoolExecutor线程池原理细节解析

    Java中的ThreadPoolExecutor线程池原理细节解析

    这篇文章主要介绍了Java中的ThreadPoolExecutor线程池原理细节解析,ThreadPoolExecutor是一个线程池,最多可使用7个参数来控制线程池的生成,使用线程池可以避免创建和销毁线程的资源损耗,提高响应速度,并且可以管理线程池中线程的数量和状态等等,需要的朋友可以参考下
    2023-12-12
  • ES修改字段类型的操作方式

    ES修改字段类型的操作方式

    ES修改字段类型是指在已有的索引中,通过特定的操作方式将某个字段的类型修改为其它类型,这篇文章主要介绍了ES修改字段类型的相关知识,感兴趣的朋友跟随小编一起看看吧
    2023-10-10

最新评论