shiro框架学习笔记(6)——登录认证+过滤器链+退出logout

5.8 登陆

 5.8.1 原理

使用FormAuthenticationFilter过虑器实现 ,原理如下:

 

将用户没有认证时,请求loginurl进行认证,用户身份和用户密码提交数据到loginurl

FormAuthenticationFilter拦截住取出request中的username和password(两个参数名称是可以配置的)

FormAuthenticationFilter调用realm传入一个token(username和password)

realm认证时根据username查询用户信息(在Activeuser中存储,包括 userid、usercode、username、menus)。

如果查询不到,realm返回null,FormAuthenticationFilter向request域中填充一个参数(记录了异常信息)

 

5.8.2 登陆页面

由于FormAuthenticationFilter的用户身份和密码的input的默认值(username和password),修改页面的账号和密码 的input的名称为username和password

 

​​​​​​​ 5.8.3 登陆代码实现

 

​​​​​​​ 5.8.4 认证拦截过虑器

在applicationContext-shiro.xml中配置:

 

 

​​​​​​​​​​​​​​5.9 退出

 

​​​​​​​​​​​​​​ 5.9.1 使用LogoutFilter

不用我们去实现退出,只要去访问一个退出的url(该 url是可以不存在),由LogoutFilter拦截住,清除session。

 

在applicationContext-shiro.xml配置LogoutFilter:

 

 

可以删除原来的logout的controller方法代码。

​​​​​​​

 

 

​​​​​​​​​​​​​​5.10 认证信息在页面显示

1、认证后用户菜单在首页显示

2、认证后用户的信息在页头显示

 

​​​​​​​​​​​​​​5.10.1 修改realm设置完整认证信息

 

realm从数据库查询用户信息,将用户菜单、usercode、username等设置在SimpleAuthenticationInfo中。

先使用静态代码实现:

 

 

​​​​​​​​​​​​​​  5.10.2 修改first.action将认证信息在页面显示

 

 

 

​​​​​​​ 5.11 授权过虑器测试

 

​​​​​​​  5.11.1 使用PermissionsAuthorizationFilter

在applicationContext-shiro.xml中配置url所对应的权限。

 

测试流程:

1、在applicationContext-shiro.xml中配置filter规则

<!--商品查询需要商品查询权限  -->

/items/queryItems.action = perms[item:query]

2、用户在认证通过后,请求/items/queryItems.action

3、被PermissionsAuthorizationFilter拦截,发现需要“item:query”权限

4、PermissionsAuthorizationFilter调用realm中的doGetAuthorizationInfo获取数据库中正确的权限

5、PermissionsAuthorizationFilter对item:query 和从realm中获取权限进行对比,如果“item:query”在realm返回的权限列表中,授权通过。

 

​​​​​​​​​​​​​​  5.11.2 创建refuse.jsp

如果授权失败,跳转到refuse.jsp,需要在spring容器中配置:

 

 

  ​​​​​​​5.11.3 问题总结

1、在applicationContext-shiro.xml中配置过虑器链接,需要将全部的url和权限对应起来进行配置,比较发麻不方便使用。

 

2、每次授权都需要调用realm查询数据库,对于系统性能有很大影响,可以通过shiro缓存来解决。

猜你喜欢

转载自blog.csdn.net/xinpz/article/details/81513731