项目流程

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

@Bean
    public PasswordEncoder passwordEncoder() {
   
        return new BCryptPasswordEncoder();
    }

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

业务层代码

@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自己的登录页面,但是实际的开发过程中是需要自己写登录页面的,所以我们将自己的登录页面放到这个项目里,就不使用默认的登录页面了。

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

配置类里面的代码

@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默认的,那么自己想要传的参数的名字是自己定义的咋办,这个时候就需要在配置文件里面进行配置了,具体的配置看以上的代码,