登录部分

代码:

    @RequestMapping(value = "/login", method = RequestMethod.GET)@ResponseBodypublic Map<String, Object> login(HttpServletRequest request){Map<String, Object> resultMap = new LinkedHashMap<String, Object>();try{ShiroToken token = new ShiroToken("admin", "21232f297a57a5a743894a0e4a801fc3");token.setRememberMe(false);SecurityUtils.getSubject().login(token);ShiroToken token2 = (ShiroToken) SecurityUtils.getSubject().getPrincipal();logger.info(token2.getUsername() + "," + token2.getPswd());resultMap.put("status", 200);resultMap.put("message", "登录成功");/*** 获取登录之前的地址*/SavedRequest savedRequest = WebUtils.getSavedRequest(request);String url = null;if (null != savedRequest){url = savedRequest.getRequestUrl();}// 跳转地址resultMap.put("back_url", url);}catch (DisabledAccountException e){resultMap.put("status", 500);resultMap.put("message", "帐号已经禁用。");}catch (Exception e){resultMap.put("status", 500);resultMap.put("message", "帐号或密码错误");}return resultMap;}

注意几点:

1、登录密码记得加密,一般存在数据库中的密码是加密过的。

2、真正开始执行登录操作的是SecurityUtils.getSubject().login(token),这个方法会调用org.apache.shiro.realm.AuthorizingRealm的doGetAuthenticationInfo方法进行登录认证:

3、出错异常记得捕获

登录验证部分

代码如下:

   @Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0){ShiroToken token = (ShiroToken) arg0;String username = token.getUsername();// 根据username从数据库查找用户,得到密码// 假设找到的用户如下// User user = userService.findByUsername(username)User user = new User();user.setName(username);user.setPassword("21232f297a57a5a743894a0e4a801fc3"); // 数据库中的密码md5加密的if (null == user){throw new AccountException("username is not exist");}else if (!user.getPassword().equals(token.getPswd())){throw new AccountException("password is not right");}else{// 登陆成功logger.info("{} login success.", username);}return new SimpleAuthenticationInfo(arg0, user.getPassword(), username);}

注意几点:

1、一般会根据username从数据库中查找该用户,得到密码

2、进行密码校验,判断一致性

3、根据获取到的用户信息,也可以进行其它判断,如用户是否激活,是否被禁用等

授权部分

代码如下:

    @Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0){ShiroToken token = (ShiroToken) SecurityUtils.getSubject().getPrincipal();String username = token.getUsername();logger.info(username + "授权...");// 从数据库中查找该用户的角色和权限SimpleAuthorizationInfo sainfo = new SimpleAuthorizationInfo();Set<String> roles = new HashSet<String>();roles.add("admin");//roles.add("role1");Set<String> permissions = new HashSet<String>();permissions.add("add");permissions.add("delete");sainfo.setRoles(roles);sainfo.setStringPermissions(permissions);return sainfo;}

注意,一般是根据用户名从数据库中查找该用户的角色和权限,进行授权;当然其它途径也是可以的,如webservice接口,配置文件等获取用户权限。

权限拦截配置

如下:

    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"><property name="securityManager" ref="securityManager"></property><property name="loginUrl" value="/security/view/login"></property><property name="successUrl" value="/successUrl"></property><!-- 用户访问未对其授权的资源时,所显示的连接 --><property name="unauthorizedUrl" value="/unauthorizedUrl"></property><property name="filters"><map><entry key="anyRoles"><bean class="cn.edu.hdu.ssd.core.shiro.AnyRolesAuthorizationFilter" /></entry></map></property><property name="filterChainDefinitions"><value>/security/**=anon/test/**=roles[role1]/users/**=anyRoles[admin,role1]/**=authc</value></property></bean>

根据用户的角色或权限来配置对应匹配的访问路径;

访问路径匹配任意角色

默认情况下,配置权限控制的时候,如

/test/**=roles[role1,admin]

结果是需要用户同时拥有role1和admin权限才能访问/test/**路径,这往往不符合我们的需求,

大部分情况,我们希望的是用户拥有role1和admin任一角色即可。

那么可以这样修改,编写一个过滤器:

public class AnyRolesAuthorizationFilter extends AuthorizationFilter
{// private Logger logger =  LoggerFactory.getLogger(ShiroCasAuthFilter.class);
    @Overrideprotected boolean isAccessAllowed(ServletRequest req, ServletResponse resp, Object mappedValue)throws Exception{Subject subject = getSubject(req, resp);String[] rolesArray = (String[]) mappedValue;if (rolesArray == null || rolesArray.length == 0){return true;}for (int i = 0; i < rolesArray.length; i++){if (subject.hasRole(rolesArray[i])){return true;}}return false;}
}

配置shiroFilter bean的filters属性,如下,

        <property name="filters"><map><entry key="anyRoles"><bean class="cn.edu.hdu.ssd.core.shiro.AnyRolesAuthorizationFilter" /></entry></map></property>

最后,权限拦截配置可以这样配:

/test/**=anyRoles[admin,role1]

本文转自风一样的码农博客园博客,原文链接:http://www.cnblogs.com/chenpi/p/6247956.html,如需转载请自行联系原作者

springmvc集成shiro例子相关推荐

  1. SpringMvc 集成 shiro 实现权限角色管理-maven

    2019独角兽企业重金招聘Python工程师标准>>> SpringMvc 集成 shiro 实现权限角色管理 1.项目清单展示 2.项目源码解析  1)spring-context ...

  2. springmvc集成shiro后,session、request姓汪还是姓蒋 ?

    1. 疑问 我们在项目中使用了spring mvc作为MVC框架,shiro作为权限控制框架,在使用过程中慢慢地产生了下面几个疑惑,本篇文章将会带着疑问慢慢地解析shiro源码,从而解开心里面的那点小 ...

  3. springmvc集成shiro后,session、request姓汪还是姓蒋?

    1. 疑问 我们在项目中使用了spring mvc作为MVC框架,shiro作为权限控制框架,在使用过程中慢慢地产生了下面几个疑惑,本篇文章将会带着疑问慢慢地解析shiro源码,从而解开心里面的那点小 ...

  4. springmvc+spring+mybatis+maven项目集成shiro进行用户权限控制【转】

    项目结构: 1.maven项目的pom中引入shiro所需的jar包依赖关系 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ...

  5. spring集成shiro详解

    最近项目中要用到shiro作为权限管理,以前都是用自定义的或者spring security,所以就开始看了一些网上的文章,但是感觉都写得很零散.而且大多数都只是给了几行代码,我们得项目相对比较复杂, ...

  6. Spring Boot 极简集成 Shiro

    点击关注公众号,Java干货及时送达 1. 前言 Apache Shiro是一个功能强大且易于使用的Java安全框架,提供了认证,授权,加密,和会话管理. Shiro有三大核心组件: Subject: ...

  7. springMVC和Shiro框架整合使用简单示例 【转】

    为什么80%的码农都做不了架构师?>>>    一.目录结构 首先是目录结构如图: 二.pom.xml文件 <project xmlns="http://maven. ...

  8. Springmvc集成CXF请看教程二

    转自: http://www.cnblogs.com/xiaochangwei/p/5399507.html 继上一篇webService入门之后,http://www.cnblogs.com/xia ...

  9. SpringMVC与Shiro快速整合

    SpringMVC与Shiro快速整合: 好久没有重新整合Shiro框架了,为了方便以后参考查阅,特此将步骤分享出来,共同学习. 一.配置XML文件: 1.到相应的pom.xml中添加shiro相关依 ...

  10. springmvc集成cas,并解决前后端分离情况

    2019独角兽企业重金招聘Python工程师标准>>> 1.最近项目需要集成已经存在的cas系统. 但是目前已集成的系统都是jsp.而我们项目是前后端分离开发(伪),没有分开部署. ...

最新文章

  1. 汇编程序:输数字,出字母
  2. onnx模型推理(python)
  3. u盘盘符不显示 win10_荣耀16.1锐龙版 linux装win10教程
  4. 数据nc文件_智能化工厂机床数据采集和数控设备联网的四大实施要点
  5. 自定义Excel导出简易组件
  6. 【Computer Organization笔记04】ALU的基本功能,1位ALU,位数扩展以及功能扩展
  7. 【Linux】Windows Ubuntu 双系统开机选择界面设置
  8. monoGSM信号强度示例
  9. 决策树系列(一)——基础知识回顾与总结
  10. 怎么打开.pos文件
  11. eCognition软件中ESP2插件的下载与安装
  12. python笔记:猜大小,随机数
  13. Java多线程--概述-转自Kyrie lrving
  14. 区块链传奇人物-爆炸头SBF
  15. mnist手写数字模型训练、保存、加载及图片预测
  16. QT 当窗口过小时发送错误 setGeometry: Unable to set geometry 25*160...Resulting geometry:116*160...
  17. 学生查分系统该怎么制作?
  18. 移动端软盘遮盖输入框的解决方案
  19. sqoop导入时候显示ERROR
  20. java的tey语句return了_java中try-catch-finally中的return语句

热门文章

  1. 如何用C#+WinRAR 实现压缩 分类:
  2. Oracle数据导入导出imp/exp sp2-0734:未知的命令开头'imp...解决方法
  3. 煤矿行业设备管理系统
  4. 《架构即未来》中最常用的15个架构原则
  5. Redis常用数据类型介绍、使用场景及其操作命令
  6. python--条件判断和循环--3
  7. 一只刚学竞价两周的菜鸟
  8. 转载分享移动网站最佳实践
  9. python第二天3.1
  10. little w and Sum(思维)