springboot-- spring security的学习

初识spring security之认证

springboot-- spring security的学习_第1张图片
启动访问http://localhost:8080/user
发现自动跳转到了http://localhost:8080/login,这是 spring security初始默认的 初始用户名user
密码是后台日志自动生成的
springboot-- spring security的学习_第2张图片登录后
springboot-- spring security的学习_第3张图片
这是默认的httpBasicLogin

自定义用户认证逻辑

禁用上面默认的httpBasicLogin

security.basic.enabled = false

对密码加密:

@Configuration
public class BrowerSecurityConfig extends WebSecurityConfigurerAdapter {

	//加密
	@Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin()                    //  定义当需要用户登录时候,转到的登录页面。
                .and()
                .authorizeRequests()        // 定义哪些URL需要被保护、哪些不需要被保护
                .anyRequest()               // 任何请求,登录后可以访问
                .authenticated();
    }
}
@Component
public class MyUserDetailsService implements UserDetailsService {


    private Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    private PasswordEncoder passwordEncoder;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        logger.info("用户的用户名: {}", username);

        String password = passwordEncoder.encode("123456");
        logger.info("password: {}", password);

        // 参数分别是:用户名,密码,用户权限
        User user = new User(username, password, AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
        return user;
    }
}

多次启动
发现每次打印出来的password都是不一样的,这就是配置的BCryptPasswordEncoder所起到的作用。
登录成功:
springboot-- spring security的学习_第4张图片
在这里插入图片描述
在这里插入图片描述

自定义登录页面


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录页面title>
head>
<body>
    <h2>自定义登录页面h2>
    <form action="/user/login"  method="post">
        <table>
            <tr>
                <td>用户名:td>
                <td><input type="text" name="username">td>
            tr>
            <tr>
                <td>密码:td>
                <td><input type="password" name="password">td>
            tr>
            <tr>
                <td colspan="2"><button type="submit">登录button>td>
            tr>
        table>
    form>
body>
html>

跳转登录页面

//  BrowerSecurityConfig.java
@Override
protected void configure(HttpSecurity http) throws Exception {
    http.formLogin()                    //  定义当需要用户登录时候,转到的登录页面。
            .loginPage("/login.html")           // 设置登录页面
            .loginProcessingUrl("/user/login")  // 自定义的登录接口
            .and()
            .authorizeRequests()        // 定义哪些URL需要被保护、哪些不需要被保护
            .antMatchers("/login.html").permitAll()     // 设置所有人都可以访问登录页面
            .anyRequest()               // 任何请求,登录后可以访问
            .authenticated()
            .and()
            .csrf().disable();          // 关闭csrf防护
}

自定义处理登录成功/失败

Spring Security中的两个接口AuthenticationSuccessHandlerAuthenticationFailureHandler。我们可以实现这个接口,并进行相应的配置就可以了。 当然框架是有默认的实现类的,我们可以继承这个实现类再来自定义自己的业务

@Component("myAuthenctiationSuccessHandler")
public class MyAuthenctiationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
    private Logger logger = LoggerFactory.getLogger(getClass());
    @Autowired
    private ObjectMapper objectMapper;

    @Override
    public void onAuthenticationSuccess(HttpServletRequest request,
                                        HttpServletResponse response, Authentication authentication) throws IOException, ServletException {

        logger.info("登录成功");
        response.setContentType("application/json;charset=UTF-8");
        response.getWriter().write(objectMapper.writeValueAsString(authentication));
    }
}
@Component("myAuthenctiationFailureHandler")
public class MyAuthenctiationFailureHandler extends SimpleUrlAuthenticationFailureHandler {
    private Logger logger = LoggerFactory.getLogger(getClass());
    @Autowired
    private ObjectMapper objectMapper;

    @Override
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
                                        AuthenticationException exception) throws IOException, ServletException {

        logger.info("登录失败");
        response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
        response.setContentType("application/json;charset=UTF-8");
        response.getWriter().write(objectMapper.writeValueAsString(exception.getMessage()));
    }
}

你可能感兴趣的:(spring,boot)