一、三种不同的登录方式
1、第一种登录方式
上一篇博客用的就是第一种登录方式,自己定义登录逻辑,自己定义页面,错误信息等,就是第一种登录方式了。
2、第二种登录方式——无状态登录
这是一种比较老的登录方式了。登录网站会弹框让你输入账号密码。这种一般就是属于 httpBasic 登录,然后把账号密码放在请求头信息中,传输到服务端解析。
这种登录有比较大的弊端:
一是不安全,因为信息都放在请求头中了;
二是这种登录是无状态登录,没有会话,也就没有 cookie 了,然后就是登录后账号密码会一直放在请求头中,不管访问哪个接口,都会一直带着这些信息去访问。衍生出的问题就是没法注销,因为信息一直放在请求头中,除非关闭浏览器再打开再登录。
这种登录方式的配置很简单:
把登录方式改成上图中画红线的部分就是了。
接着运行服务器:
这种就是前面说的登录后弹出的框框了。
这就是请求头中保存的信息,用的是 base64编码的方式:
Base64 解码,Java 代码中也有:
这时候后续再进入登录页面,可以发现请求头中已经有包含的账号信息了:
3、第三种登录方式——Shiro提供的默认登陆方式
第三种登陆方式,不需要自己写登陆逻辑,因为 Shiro 默认就是这个登录逻辑。但是登录成功跟登录失败还是要自己处理,下面截图是处理:
上图中最后返回的是逻辑视图名。
然后在 Spring 配置页面配置登陆成功后跳转的页面;并且登陆成功之后也不走 doLogin 了,这里也需要改,
二、RememberMe登录
1、RememberMe介绍
比如一些电商网站,像是某东,某宝,关掉浏览器之后的一段时间内再打开页面,依然还是能浏览的,但是如果要下单的时候,还是要求要登录的;这种功能就是 RememberMe。所以我们可以把操作分为两类,一类是敏感操作,另一类是不敏感操作;如果操作的是不敏感操作,则可以浏览,如果是要操作敏感操作,则自动跳转登录页面。开启这个功能之后,虽然用户体验会变好,但是安全性会变差,但是这种变差的幅度在可接受范围内。这种时间一般默认是两周。
前端加一个 记住我:
接着后端代码:
后端代码多接收一个参数,然后做判断:
然后配置:
接着就能成功访问,如果不勾选记住我,当关掉浏览器时,是不能直接进入 index 页面的;如果勾选了,则登录成功后关掉浏览器,再打开是可以直接进入 index 页面的。
2、注销
在shiro里面,注销很简单,不需要自己写注销的接口,也没有 session之类的东西:
前端:
配置:
这么写,就完成了。
三、Shiro 授权
对于安全管理框架来讲,主要就两个功能,认证跟授权,认证就是登录。授权就是给某些角色权限,比如超级管理员能访问所有页面,但是有的权限不够的普通角色就不能访问。
1、授权
a、定义接口
现在定义三个接口:
b、配置授权(拥有某个角色或同时拥有才能访问)
然后配置文件:
然后前面写的 MyRealm 需要更改一个继承的类,但是原本写的代码不需要动:
然后重写一个方法:
到目前为止,就写的差不多了,当访问某个路径的时候,就会调取这个方法获取角色,如果有就允许访问,看到页面,如果没有就不允许访问。我们可以写一个当权限不足时返回的页面:
配置:
然后看下数据库:
那么此时就完成了:
zs 只能访问普通页面,ls 能访问 admin 的页面,ww 才能访问 user 页面。
c、配置授权(拥有某些角色中的一个就能访问)
目前为止的访问可以发现都是必须同时满足要求才能访问,比如当有两个角色的时候,就必须同时拥有两个角色才能访问,如果想要 user 或者 admin 中的一个角色就能访问呢:
查看源码可以发现,只需要重写某个方法即可:
接着注册:
这么弄完就可以了。
三、其他配置
1、配置注销后的跳转页面
一般注销之后跳转的是登录页面,但这里默认的路径是 /,参考下方配置修改:
2、处理 JsessionID
有时候发现地址栏会带有 JsessionID,把 JsessionID 暴露到地址栏里会有不安全的问题,所以配置将 JsessionID 不要暴露到地址栏里: