创建个项目
引入Spring Web和Spring Security 即可
写个Controller接收请求 转发重定向都可以
static下定义两个页面
login.html页面 用来登录
main.html如果可以跳到这里,说明登录成功
启动运行程序
我们访问登录接口 或者是访问静态资源都会重定向到这个页面
这个页面说明 Spring Security已经生效
任何访问资源,都需要此操作登录再操作
用户名 user
密码是启动时在控制台输出的这串 且每次启动都是不一样的
也就是说引入Spring Security依赖后,对接口访问和静态页面的访问都进行了控制
首先,第一点,即使我不觉得你的登录页面丑,用户名,密码总要去数据库查询出来的,不可能,每次用user,然后去看控制台
那么需要实现两个接口
UserDetailsService 和 PasswordEncode 命名也好记
现在大概了解下UserDetailsService
返回的这个UserDetails
而返回的UserDetails也是个接口,正常肯定由个实现类
。。。。。
注意User这个类,可能和我们平时定义的User注意要区分,另外 User里面的password是数据库查出来的,而不是前端传进来的
大概原理是这样,前端传进来一个userName,然后我们去查数据库,没有,那么就没有,有的话,将密码,权限,什么乱七八糟的交给它
我们需要自定用户名密码这些的话,除了要实现UserDetailsService还要实现PasswordEncode
大概了解下PasswordEncode
其实在我们引入Spring Security时候可以看出来 Spring Security自带默认肯定有这么个实例了
测试一下这个加密
那么Spring Security是如果判断加密后的密码和原来的密码是否相同呢
且加密后的密码是单向的,不知道的原始密码是无法破解,.......这个无法破解还是算了
那么这里就是大概原理了解了一点点 一丢丢
那么可以这么说:这个PasswordEncode就是对我从数据库通过用户名找到的密码进行加解密的
下面我们来实现自定义的登录逻辑:但是Spring Security有要求,就是你要实现自定义的登录逻辑,需要容器内先要有个PasswordEncode的实例
需要写个配置类
另外还要写个类实现UserDetailsService接口
现在启动程序 控制台不再打印密码
输入admin 123456就可以访问了
自定义登录逻辑就写完了
那么如何自定义登录页面呢
实现自定义登录页面很简单
让原先定义的配置类 继承 WebSecurityConfigurerAdpter
这样一来,Spring Security就将页面访问控制权交给了我们自己 它的页面就失效
但是随之带来的问题是,我们现在既可以访问login.html main.html 好像访问控制权限已经完全失效了
那么就需要授权方面的一些什么什么什么的
重新启动程序,发现所有页面又都没不能访问了
上面的写法意思就是所有请求,都必须认证, 也就是说,这样写,把门都堵死了,那么开个门
启动程序
但是又出现个问题,就是登录没有反应
发现Spring Security并没有拦截我们的登录请求,就是根本没进这个方法来
还是没反应 关闭csrf防护 不知道
现在登录终于访问方法了
但是放心debug后 页面报错
原因时,登录成功后没有指定跳转到哪个页面
控制器根本没进来,也就是一切还是Spring Security控制着
需要告诉Spring Security登录成功后跳转到哪个页面
启动
原因在于Spring Security要求 登录成功后的跳转页面必须是Post请求
也就是说原先的登录就是摆设
,当用户名,密码输入错误的时候, 比如说,当某些时候,业务需要让它去error页面的情况如何操作呢
先自定一个error页面
如果登录失败
关于设置请求账户和密码的参数名
那么Spring Security具体是怎么做到的
查看UsernamePasswordAuthenticationFilter
原来你是这么干的
如何改掉固定参数名
这样的话就改掉了,那么我们自定义的登录页面也需要修改下