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