Spring Security笔记

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

创建个项目

 

 引入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

 原来你是这么干的

 如何改掉固定参数名

这样的话就改掉了,那么我们自定义的登录页面也需要修改下

下面看一个问题,它其实是转发到我们的控制去

但是直接让它在这里进行外部资源访问,它是做不到的

 当然我们可以转发到控制器再进行重定向

但是直接让它

 重写AuthenticationSuccessHandler

换一种写法,显得很low

注释掉

 

现在很多项目都是前后端分离

 大概理解.......

输入admin  123456

这种时候就比百度难多了

需要干点事

 

 

 注意:password为null??????? 这是Spring Security考虑到安全原因输出为null

上面这些信息不就是这里放进去的吗

 自定义登录成功处理器就这么回事,也是不能和failureForwardUrl共存的

下面自定义登录失败处理器,那不就是照葫芦画瓢么

 

 

 

 运行自己可以试下

授权认证,其实和MVC拦截器比较类似,拦截或者放行

 上面anyRequest就是所有请求都需要做什么事  一般都是.anyRequest().authenticated().即都需要被认证,即登录后可以访问

而anyMatchers就是匹配某些,实际工作中可以这么配置如下

 比如说一般

static下有js,css,images等

 配置下

这样就可以访问到了,即使你没有登录

 

 关于regexMathcers

很明显,是一个正则的匹配方式

另外无论是antMathcers还是regexMathcers不单只有上面演示的一个参数的方法

还有一个两个参数的方法

 HttpMethod就是Http的请求方式,

这里就用regexMathcers演示,antMathcers也一样的

 

 

 

 说明不光可以对静态文件放行,还可以对接口放行

另外一个就是如果传入POST,或者GET等等,就要注意,接口上的请求方式了,必须吻合

关于mvcMathcers

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Spring