首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >springboot系列学习(二十九): springsecurity自定义的登录的逻辑,也就是我们从数据库中拿用户名和密码 (二)

springboot系列学习(二十九): springsecurity自定义的登录的逻辑,也就是我们从数据库中拿用户名和密码 (二)

作者头像
一写代码就开心
发布2020-11-20 14:11:25
发布2020-11-20 14:11:25
1.3K0
举报
文章被收录于专栏:java和pythonjava和python

项目流程

1 创建数据库 2 创建一个maven项目 3 导入依赖 4 写连接数据库的配置文件 5 配置类里面要写密码解析器的代码,这个是springsecurity框架 必须要有的

代码语言:javascript
复制
@Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

6 其他层写完。我们要写业务层,登录处理的逻辑就是在业务层。在业务层里面要将密码从数据库拿出来,所以要写mapper层,控制层是接收前端传过来的数据,将数据传到业务层。所以重要的逻辑是在业务层

业务层代码

代码语言:javascript
复制
@Service        要实现登录的验证,必须要实现这个接口
public class UsersServiceImpl implements UserDetailsService {
    @Autowired
    private UsersMapper usersMapper;
    @Override    重写接口里面的方法,返回值是UserDetails
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        System.out.println("执行了登录逻辑");
        Users users = usersMapper.selectByUsername(username);  从数据库查询有没有这个用户
        if(users==null){
            throw new UsernameNotFoundException("用户名不存在");
        }
                                                                                用户名在数据库存在,返回这个用户的对象
        return new User(username,users.getPassword(), AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
    }
}

不写控制层的话,直接启动,是springSercurity的默认的登录界面,我们输入的用户名和密码是直接到业务层,之后就进行数据库的验证。(此时数据库里面的密码是加密之后的密码)

==================================================================

以上使用的是springsecurity自己的登录页面,但是实际的开发过程中是需要自己写登录页面的,所以我们将自己的登录页面放到这个项目里,就不使用默认的登录页面了。

自己写了一个登录页面,也配置了相应的控制器,但是此时项目还是不可以直接访问我们写的页面,还是会跳到默认的登录页面,所以我们需要在配置类里面进行配置,告诉项目,我要关掉默认的登录页面,使用 我自己的页面。

配置类里面的代码

代码语言:javascript
复制
@Configuration    这个配置类必须要继承 WebSecurityConfigurerAdapter  
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override   重写继承类的方法
    protected void configure(HttpSecurity http) throws Exception {
        // 配置认证
        http.formLogin()
                // 哪个URL为登录页面
                .loginPage("/")   用户其他的页面没有认证,那么就转到这个登录页面
                // 当发现什么URL时执行登录逻辑
                .loginProcessingUrl("/login")  表单提交走的路径,当继承WebSecurityConfigurerAdapter
                                                必须要这样写
                // 成功后跳转到哪里
//                .successForwardUrl("/success")   登录成功之后转发的路径,得自己写
                   登录之后重定向的代码(转发和重定向的区别是url地址的变化)
//                .successHandler(new SimpleUrlAuthenticationSuccessHandler("/success"))
                   这个也是重定向(地址变化了)
//                .defaultSuccessUrl("/success123")
                  以下是自己定义的转发,自己写逻辑,比如ajax
                .successHandler(new AuthenticationSuccessHandler() {
                    @Override
                    public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException {
                        httpServletResponse.sendRedirect("http://www.jing.com");
                    }
                })
                // 失败后跳转到哪里
//                .failureForwardUrl("/fail")  登录失败之后转发的路径,得自己写
                 失败之后重定向的地址
                .failureUrl("http://www.jing.com")
                 失败之后自定义的路径,重定向,
                .failureHandler(new AuthenticationFailureHandler() {
                    @Override
                    public void onAuthenticationFailure(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException {
                        httpServletResponse.sendRedirect("http://www.jing.com");
                    }
                })
以下的两个方法就是自己定义的前端传过来的参数
                .usernameParameter("username123")
                .passwordParameter("password123");

        // 设置URL的授权问题
        // 多个条件取交集
        http.authorizeRequests()
                // 匹配 / 控制器  permitAll() 不需要被认证就可以访问
                .antMatchers("/").permitAll()  也就是配置了这个,只要路径是/  那么就不需要认证就可以访问
                // anyRequest() 所有请求   authenticated() 必须被认证
                .anyRequest().authenticated();  除了/请求,其他的都需要认证才可以访问
        // 关闭csrf
        http.csrf().disable();
    }
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

现在我们在前段进行写用户名和密码的名字的时候,必须是username password,其他的不行,因为这个是springsecurity默认的,那么自己想要传的参数的名字是自己定义的咋办,这个时候就需要在配置文件里面进行配置了,具体的配置看以上的代码,

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/10/09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 项目流程
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档