=========默认鉴权========

过滤链中定义:

  1. <!-- 过滤链定义 -->
  2. <property name="filterChainDefinitions">
  3. <value>
  4. ...
  5. /pages/User/create.do* = perms[User:create]
  6. ...
  7. </value>
  8. </property>

这段配置的含义是:/pages/User/create.do*这样的请求路径,需要鉴权,且需要用户有“User:create”的权限字符串。

perms是拦截器的名字,默认实现类是:org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter

这个过滤器会得到配置中请求路径对应的权限字符串,如“User:create”,然后到realm中查找当前用户包含的权限,具体来说是调用reaml的回调函数:

  1. /**
  2. * 鉴权回调函数,提取当事人的角色和权限
  3. * principals 当事人
  4. */
  5. protected AuthorizationInfo doGetAuthorizationInfo(
  6. PrincipalCollection principals) {
  7. //用户名
  8. String username = (String) principals.fromRealm(
  9. getName()).iterator().next();
  10.  
  11. /*这些代码应该是动态从数据库中取出的,此处写死*/
  12. if(username!=null&&username.equals("admin")){
  13. SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
  14. // info.addRole("admin");//添加一个角色,不是配置意义上的添加,而是证明该用户拥有admin角色
  15. info.addStringPermission("User:create");
  16. info.addStringPermission("/pages/index.jsp");//添加权限
  17. info.addStringPermission("/pages/info.jsp");//添加权限
  18. return info;
  19. }
  20. return null;
  21. }

此代码属于自定义Realm——public class CustomRealm extends AuthorizingRealm

代码中我们使用的是测试数据,直接往info里面添加角色字符串和权限字符串,我们也可以从数据库中获取,这不是本节重点。

现在关键要明白SecurityManager是从请求端得到应该有的权限字串,从Realm得到当事人具备的角色和权限字串,然后比对,比对成功说明鉴权成功,否则鉴权失败。

事实上,这种配置鉴权的方式,连自定义Realm都不需要,用户信息、角色信息、权限信息都可以配置:

  1. [users]
  2. # user1 = sha256-hashed-hex-encoded password, role1, role2, ...
  3. user1 = 2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b, role1, role2, ...
  4. [roles]
  5. # 'admin' role has all permissions, indicated by the wildcard '*'
  6. admin = *
  7. # The 'schwartz' role can do anything (*) with any lightsaber:
  8. schwartz = lightsaber:*
  9. # The 'goodguy' role is allowed to 'drive' (action) the winnebago (type) with
  10. # license plate 'eagle5' (instance specific id)
  11. goodguy = winnebago:drive:eagle5

这点可以参考官方文档。

===================自定义鉴权=================

往往我们的项目,特别是遗留项目都会设计几张表来存储用户信息和角色信息以及权限映射信息,所以Realm这块,一般要自定义。

而且通常的作法是直接用请求的URL作为权限字符串的,也就是不需要URL再去映射一些权限字符串,所以过滤器这块,我们可能也需要自定义。

自定义鉴权过滤器:

  1. package javacommon.shiro;
  2.  
  3. import java.io.IOException;
  4. import java.util.regex.Matcher;
  5. import java.util.regex.Pattern;
  6.  
  7. import javax.servlet.ServletRequest;
  8. import javax.servlet.ServletResponse;
  9. import javax.servlet.http.HttpServletRequest;
  10.  
  11. import org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter;
  12.  
  13. /**
  14. * 基于URL的权限判断过滤器<p>
  15. * 我们自动根据URL产生所谓的权限字符串,这一项在Shiro示例中是写在配置文件里面的,默认认为权限不可动态配置<p>
  16. * URL举例:/User/create.do?***=*** -->权限字符串:/User/create.do
  17. * @author zhengwei lastmodified 2013年8月15日
  18. *
  19. */
  20. public class URLPermissionsFilter extends PermissionsAuthorizationFilter{
  21. /**
  22. *@param mappedValue 指的是在声明url时指定的权限字符串,如/User/create.do=perms[User:create].我们要动态产生这个权限字符串,所以这个配置对我们没用
  23. */
  24. public boolean isAccessAllowed(ServletRequest request,
  25. ServletResponse response, Object mappedValue) throws IOException {
  26. return super.isAccessAllowed(request, response, buildPermissions(request));
  27. }
  28. /**
  29. * 根据请求URL产生权限字符串,这里只产生,而比对的事交给Realm
  30. * @param request
  31. * @return
  32. */
  33. protected String[] buildPermissions(ServletRequest request) {
  34. String[] perms = new String[1];
  35. HttpServletRequest req = (HttpServletRequest) request;
  36. String path = req.getServletPath();
  37. perms[0] = path;//path直接作为权限字符串
  38. /*String regex = "/(.*?)/(.*?)\\.(.*)";
  39. if(url.matches(regex)){
  40. Pattern pattern = Pattern.compile(regex);
  41. Matcher matcher = pattern.matcher(url);
  42. String controller = matcher.group(1);
  43. String action = matcher.group(2);
  44.  
  45. }*/
  46. return perms;
  47. }
  48. }

可以看出我们直接将请求路径作为权限字符串,过滤器会去调用Realm,所以自定义Realm中也要为用户添加同样格式的权限字符串

  1. info.addStringPermission("/pages/index.jsp");//添加权限,admin可访问这个路径

最后再来看看全局Filter的配置:

  1. <!-- Shiro Filter 拦截器相关配置 -->
  2. <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
  3. ...
  4. <property name="filters">
  5. <util:map>
  6. <entry key="authc" value-ref="myAuthenFilter" />
  7. <entry key="perms" value-ref="URLPermissionsFilter" />
  8. </util:map>
  9. </property>
  10. <!-- 过滤链定义 -->
  11. <property name="filterChainDefinitions">
  12. <value>
  13. /login.jsp = authc
  14. /pages/* = authc,perms
  15. /logout.do = logout
  16. ...
  17. </value>
  18. </property>
  19. </bean>
  20.  
  21. ...
  22. <!-- 自定义鉴权拦截器 -->
  23. <bean id="URLPermissionsFilter" class="javacommon.shiro.URLPermissionsFilter" />

这段配置意味着访问/pages/*都需要鉴权,而鉴权使用的是自定义的拦截器。

测试:

以admin身份登录并访问pages/info.jsp,没问题,因为它拥有这个权限。

访问pages/NB.jsp,因为这个路径没有添加到admin的权限中,所以鉴权失败,将跳转到unauthorizedUrl指定的路径。

小节:

对于客户要求程序开发者自己管理权限,而且不需要动态配置的情况,使用默认配置法,非常简单。

当需要动态管理权限,那就要自定义Realm和Filter,关键在于请求URL--》权限字符串,Realm可返回一个用户拥有的权限字符串。

这些字符串应该能比对上。

Shiro(4)默认鉴权与自定义鉴权的更多相关文章

  1. springboot+security整合(3)自定义鉴权

    说明 springboot 版本 2.0.3源码地址:点击跳转 系列 springboot+security 整合(1) springboot+security 整合(2) springboot+se ...

  2. css修改input表单默认样式重置与自定义大全

    链接地址: 伪元素表单控件默认样式重置与自定义大全 http://www.zhangxinxu.com/wordpress/?p=3381 Chrome 现在不支持通过伪元素修改 meter 元素样式 ...

  3. 1、 Shiro框架:认证,授权(验权 2. Shiro框架实现权限控制方式:

    1. Shiro框架:认证,授权(验权) a) 认证逻辑:applicationCode—>通过工具类获取subject对象,调用login方法参数令牌信息->安全管理器------> ...

  4. cesium默认全屏按钮自定义

    cesium默认全屏按钮自定义 1  隐藏默认的svg 2  修改它默认的按钮边框,背景 3   修改它点击时的样式 代码如下: .cesium-viewer-fullscreenContainer ...

  5. Taurus.MVC 微服务框架 入门开发教程:项目集成:4、默认安全认证与自定义安全认证。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

  6. Spring Cloud注册中心Eureka设置访问权限并自定义鉴权页面

    原文:https://blog.csdn.net/a823007573/article/details/88971496 使用Spring Security实现鉴权 1. 导入Spring Secur ...

  7. 使用SpringSecurity Oauth2.0实现自定义鉴权中心

    Oauth2.0是什么不在赘述,本文主要介绍如何使用SpringSecurity Oauth2.0实现自定义的用户校验 1.鉴权中心服务 首先,列举一下我们需要用到的依赖,本文采用的是数据库保存用户信 ...

  8. Spring Boot 鉴权之—— JWT 鉴权

    第一:什么是JWT鉴权 1. JWT即JSON Web Tokens,是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519),他可以用来安全的传递信息,因为传递的信息是 ...

  9. spring cloud jwt用户鉴权及服务鉴权

    用户鉴权 客户端请求服务时,根据提交的token获取用户信息,看是否有用户信息及用户信息是否正确 服务鉴权 微服务中,一般有多个服务,服务与服务之间相互调用时,有的服务接口比较敏感,比如资金服务,不允 ...

随机推荐

  1. 调用git命令行执行更新的思路

    cd /usr/local/software/CloudPlatformUtil/GitLab # CentOS6.5自带的git版本是1.7.1 # 安装高版本git wget -O git.zip ...

  2. 自己编译生成k8s的rpm包

    我指的是以下几个安装包: -rw-r--r--. 1 root root 8976134 Jul 13 10:19 kubeadm-1.7.0-0.x86_64.rpm-rw-r--r--. 1 ro ...

  3. Python基础系列----字典、基本语句

    1.定义                                                                                               映 ...

  4. Power BI连接至Mogo Altas Connector For BI

    我需要使用Power BI连接至Connector For BI ,现在Connect For BI存放在Mongo Atlas中,详细的来自于官方文档,https://docs.atlas.mong ...

  5. VS2013 打开项目时提示This project is incompatible with the current edition Visual Studio.

    刚安装完成了Visual Studio 2013后,打开项目时,遇到以下问题 解决方法:在Visual Studio 2013 的菜单中打开“Tools",并打开“Extensions an ...

  6. Unable to find a qt build, to solve this problem specify a qt build

    可能路径设置不对,比如大小写错误导致找不到qmake编译器,点击VS工具栏的QT菜单,选择options,指定qt Build所在的路径(qt安装路径),然后点击ok. 这是修改过默认安装路径的

  7. 两个线程交替打印奇偶数【Lock版】

    import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public clas ...

  8. Vue 2.0 Application Sample

    ===搭建Demo=== http://blog.csdn.net/wangjiaohome/article/details/51728217 ===单页Application=== http://b ...

  9. JavaWeb中常见的乱码处理(亲测)

    常见编码方式: ISO-8859-1  西欧码 GB2312  简体中文码 GBK   大五码 UTF-8 全球码(推荐) 1.页面(HTML,JSP,Servlet) <%@ page lan ...

  10. Sqli-labs less 1

    Less-1 我们可以在http://127.0.0.1/sqllib/Less-5/?id=1后面直接添加一个 ' ,来看一下效果: 从上述错误当中,我们可以看到提交到sql中的1'在经过sql语句 ...