spring security 开发 基于表单的认证

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/uotail/article/details/89058019

终于进入 spring security 的章节了


在这里插入图片描述

http basic 安全验证

在第一章构建项目中说到
当项目依赖中 含有 spring security 的jar 包时
它会有一个默认的安全配置http basic
所有一开始我们用下面的注解移除掉了它的默认安全配置

在这里插入图片描述
spring security 默认的安全验证我们一般是不用的

实现用户名+密码认证

开始开发基于表单的安全验证

创建 BrowserSecurityConfig 类 配置安全验证

在这里插入图片描述

@Configuration
public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin()   //指定身份认证的方式为表单登录
                .and()
                .authorizeRequests() //对请求授权
                .anyRequest()        //任何请求
                .authenticated();    //安全认证
        //任何请求都必须经过表单验证才能进行访问

    }
}

运行并测试

直接运行我们这个项目 demoApplication ,发现报错

No qualifying bean of type 'org.springframework.security.config.annotation.ObjectPostProcessor<?>' available
2019-04-06 19:31:05.208  INFO 18932 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]

https://stackoverflow.com/questions/32081578/spring-security-nosuchbeandefinitionexception-no-qualifying-bean-of-type-org
原因是我们关闭了spring security的安全验证配置
把红框里的注解去掉
在这里插入图片描述

再次运行 成功
访问 http://localhost:8080/hello 后会跳到登录界面

用户名为 user
密码 在 控制台打印出了,这个密码每次启动都会变
在这里插入图片描述
当登录成功后,它又会跳到我们之前访问的url

如果还想用http basic 验证 ,只需更改一行代码
在这里插入图片描述
这样就可以了

基本原理

主要是由一层层过滤器构成····
在这里插入图片描述

自定义用户认证逻辑

处理用户信息获取逻辑

用户信息的获取 在 spring security 中是被 封装在 userDetailService 接口中
在这里插入图片描述
自定义自己的userDetailService 实现类
在这里插入图片描述

@Component
public class MyUserDetailsService implements UserDetailsService {
    // 这里注入dao 层 用于查询数据库

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

    public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {
        //根据用户名从数据库查找用户信息

        logger.info("登录用户名"+ userName);
        //我们要验证用户名 密码 并 查取权限
        User admin = new User(userName, "123456",
                AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));//第三个参数是做授权的
        return admin;
    }
}

启动应用 访问 http://localhost:8080/hello 输入用户密码后台报错
在这里插入图片描述
原因:版本升级 因为Spring security 5.0中新增了多种加密方式,也改变了密码的格式。
https://spring.io/blog/2017/11/01/spring-security-5-0-0-rc1-released
https://docs.spring.io/spring-security/site/docs/5.0.0.RELEASE/reference/htmlsingle/#ns-password-encoder
https://www.cnblogs.com/majianming/p/7923604.html
https://blog.csdn.net/Canon_in_D_Major/article/details/79675033
解决:待会解决 需要配置 PasswordEncoder

处理用户校验逻辑

用户是否冻结,密码是否过期等验证信息
在这里插入图片描述

处理密码加密解密逻辑

配置 PasswordEncoder

在这里插入图片描述
修改 MyUserDetailsService 的 loadUserByUsername 的方法
在这里插入图片描述
在这里插入图片描述

测试成功 ,也解决了之前的问题
在这里插入图片描述

注意 密码都是123456 ,但每次打印出来得密码都不一样 不像md5

因为他会随机生成一个盐,将随机生成的盐混在密码串里面,当他判断的时候 再用随机生成的盐来反推当时的密码串

个性化用户认证流程

自定义登录页面

定义登录页面 ,并配置 以及 可能出现的错误原因
在这里插入图片描述

<html>
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
<h2>标准登录页面</h2>
<h3>表单登录</h3>
<form action="/authentication/form" 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>

配置登录页面 即 会有的错误
在这里插入图片描述
解决
在这里插入图片描述
启动测试 成功
在这里插入图片描述

自定义登录成功处理

在这里插入图片描述
在这里插入图片描述
具体要求和解释如下
https://docs.spring.io/spring-security/site/docs/5.2.0.BUILD-SNAPSHOT/api/org/springframework/security/config/annotation/web/configurers/FormLoginConfigurer.html

https://docs.spring.io/spring-security/site/docs/5.2.0.BUILD-SNAPSHOT/reference/htmlsingle/#jc-form

但我不知道什么原因我的 loginProcessingUrl 设置一直失效,查了好久也没解决,后面有时间再看

自定义失败处理

实现手机号+短信认证

猜你喜欢

转载自blog.csdn.net/uotail/article/details/89058019