首先4个比较好的例子供参考:

1.常规Spring MVC拦截器实现的认证和权限管理例子

https://blog.csdn.net/u013647382/article/details/53995655

2.Shiro+SSM整合例子带数据库可成功访问

https://blog.csdn.net/zzhao114/article/details/55662585

3.Shiro权限管理框架详解(讲解的非常好)

https://www.cnblogs.com/jpfss/p/8352031.html

4. Shiro权限控制过程

http://itwgy.com/html/frame/159.html

先巩固一下session客户端实现的过程:

浏览器第一次访问某个javaee应用的地址时,发送的request的Cookie里是没有JSESSIONID的,

当response时会Set-Cookie设上一个web服务器对本次会话分配的JSESSIONID,

实际上HTTP协议是无状态的,每次请求都跟前一次没有什么关联,但只要你不是每次都重启浏览器来打开页面,

在同一个浏览器进程中不断的打开同一个应用的地址,浏览器都会附带上同样的cookie信息。

这样根据这个JSESSIONID web服务器就会把所有相同JSESSIONID连接识别成同一个会话。

所以说对于web应用来说即使没登录也有session,只不过session中没有存储登录信息。

因此注销时一定要清除session中的信息。注销后再登陆还是同一个JSESSIONID哦(先不管session过期的问题)。

常规Spring MVC拦截器实现的认证和权限管理的主要流程:

登录页面提交登录信息到控制器的登录处理方法,从数据库中根据用户名密码判断登录是否成功,

成功的话将用户信息和权限放到session中。

自定义的Spring MVC登录拦截器权限拦截器实际上就是从seesion中读取当前用户的登录和权限信息,进行对应的认证和权限匹配。

用户是否登录就判断当前会话session中是否存有用户信息对象,有就认为已登录。

权限就判断请求地址是否在权限列表中。

Shiro实现的认证和权限管理的主要流程:

未登录请求都转到配置的loginUrl上,

登录页面提交登录信息到控制器的登录处理方法,

调用SecurityUtils.getSubject().login(token),

转到自定义的MyRealm域中的doGetAuthenticationInfo方法进行认证。

成功的话将由shiro管理这次会话session控制了。不成功会抛出各种异常。

对权限控制调用MyRealm域中的doGetAuthorizationInfo获得当前用户的权限,

结合spring-shrio中的权限配置即可控制。

通过比较可以看出用shiro的好处:

无须再写自定义的SpringMVC登录拦截器和权限拦截器。

但是要在web.xml中配置shrio拦截器。

只要spring-shiro配置文件中配置好相关权限设置,

配合MyRealm中

doGetAuthenticationInfo登录验证

doGetAuthorizationInfo读取用户权限

即可同样实现。

简单的登录权限验证功能跟自己写拦截器差不多,要求有高级功能可以拓展,自己实现就复杂了,

重要的是别人都用了,不会就过时了。

============shiro配置学习================

参考例子:https://blog.csdn.net/ruihaol/article/details/52186318

<!-- 权限配置 -->
<property name="filterChainDefinitions">
<value>
<!-- anon表示此地址不需要任何权限即可访问 -->
/static/**=anon
<!-- perms[user:query]表示访问此连接需要权限为user:query的用户 -->
/user=perms[user:query]
<!-- roles[manager]表示访问此连接需要用户的角色为manager -->
/user/add=roles[manager]
/user/del/**=roles[admin]
/user/edit/**=roles[manager]
<!--所有的请求(除去配置的静态资源请求或请求地址为anon的请求)都要通过登录验证,如果未登录则跳到/login-->
/** = authc
</value>
</property>
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
//获取登录时输入的用户名
String loginName=(String) principalCollection.fromRealm(getName()).iterator().next();
//到数据库查是否有此对象
User user=userService.findByName(loginName);
if(user!=null){
//权限信息对象info,用来存放查出的用户的所有的角色(role)及权限(permission)
SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
//用户的角色集合
info.setRoles(user.getRolesName()); // getRolesName()返回Set<String>,存放用户所属角色的集合,比如admin manager noraml,小系统就一个用户一个角色就行了,角色id作为用户的一个字段
//用户的角色对应的所有权限,如果只使用角色定义访问权限,下面的四行可以不要
List<Role> roleList=user.getRoleList();
for (Role role : roleList) {
info.addStringPermissions(role.getPermissionsName()); // 将角色拥有的权限字符串Set<String>集合给该用户,比如query add delele 等
}
return info;
}
return null;
}

可以看出通过shiro配置的filterChainDefinitions,可通过角色、权限(或称为资源)来共同控制,

小系统通过基于角色授权控制就行了(角色能干什么其实就是定义哪个角色能访问什么地址,可以通过自定义filter来讲配置转到数据库中)。

复杂的系统通过基于权限角色授权控制。

shiro学习总结的更多相关文章

  1. Shiro学习笔记(5)——web集成

    Web集成 shiro配置文件shiroini 界面 webxml最关键 Servlet 測试 基于 Basic 的拦截器身份验证 Web集成 大多数情况.web项目都会集成spring.shiro在 ...

  2. Shiro学习

    Shiro学习资源 Shiro官网,http://shiro.apache.org/index.html 学习网站链接,http://blog.java1234.com/blog/articles/4 ...

  3. Apache Shiro学习-2-Apache Shiro Web Support

     Apache Shiro Web Support  1. 配置 将 Shiro 整合到 Web 应用中的最简单方式是在 web.xml 的 Servlet ContextListener 和 Fil ...

  4. shiro学习笔记_0600_自定义realm实现授权

    博客shiro学习笔记_0400_自定义Realm实现身份认证 介绍了认证,这里介绍授权. 1,仅仅通过配置文件来指定权限不够灵活且不方便.在实际的应用中大多数情况下都是将用户信息,角色信息,权限信息 ...

  5. Apache shiro学习总结

    Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...

  6. Shiro学习笔记总结,附加" 身份认证 "源码案例(一)

    Shiro学习笔记总结 内容介绍: 一.Shiro介绍 二.subject认证主体 三.身份认证流程 四.Realm & JDBC reaml介绍 五.Shiro.ini配置介绍 六.源码案例 ...

  7. SpringBoot+Shiro学习(七):Filter过滤器管理

    SpringBoot+Shiro学习(七):Filter过滤器管理 Hiwayz 关注  0.5 2018.09.06 19:09* 字数 1070 阅读 5922评论 1喜欢 20 先从我们写的一个 ...

  8. Apache Shiro 学习记录5

    本来这篇文章是想写从Factory加载ini配置到生成securityManager的过程的....但是貌似涉及的东西有点多...我学的又比较慢...很多类都来不及研究,我又怕等我后面的研究了前面的都 ...

  9. Apache Shiro 学习记录4

    今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...

  10. Apache Shiro 学习记录1

    最近几天在学习Apache Shiro......看了一些大神们的教程.....感觉收获不少.....但是毕竟教程也只是指引一下方向....即使是精品教程,仍然有很多东西都没有说明....所以自己也稍 ...

随机推荐

  1. 小白都能看明白的VLAN原理解释

    为什么需要VLAN 1. 什么是VLAN? VLAN(Virtual LAN),翻译成中文是“虚拟局域网”.LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络.VLAN ...

  2. vue及ElementUI环境搭建

    1. nodejs安装及npm安装 下载地址:https://nodejs.org/en/download/ 选择windows Installer 下载完成后 运行node-v8.11.1-x64. ...

  3. 如何知道局域网内哪些ip被占用----工具法Free IP Scanner

    在局域网中,尤其是在工作室和公司中需要修改IP地址才能上网,通常我们在设置完ip地址后会提示[该ip地址已被占用],又得回头去修改ip地址.本篇经验就介绍一款很好用的免费软件——Free IP Sca ...

  4. hdoj:2055

    #include <iostream> #include <string> using namespace std; bool islower(char ch) { if (c ...

  5. Windows 10下安装配置Caffe并支持GPU加速(修改版)

    基本环境 建议严格按照版本来 - Windows 10 - Visual Studio 2013 - Matlab R2016b - Anaconda - CUDA 8.0.44 - cuDNN v4 ...

  6. activemq 安装 部署

    ActiveMQ是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的.可扩展的.稳定的和安全的企业级消息通信.ActiveMQ使用Apache提供的授权,任何人都可 ...

  7. Git:git diff 命令详解

    工作目录 vs 暂存区 $ git diff <filename> 意义:查看文件在工作目录与暂存区的差别.如果还没 add 进暂存区,则查看文件自身修改前后的差别.也可查看和另一分支的区 ...

  8. java使用指定的国际化文件

    java代码: import java.util.Locale; import org.junit.Test; /** * 使用指定的国际化文件 */ public class Demo { @Tes ...

  9. 【腾讯云的1001种玩法】 Laravel 整合万向优图图片管理能力,打造高效图片处理服务

    版权声明:本文由白宦成原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/574549001488234358 来源:腾云阁 h ...

  10. hdu 4486 Pen Counts

    Pen Counts Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...