springmvc集成shiro例子
仅供参考
仅供参考
登录部分
代码:
@RequestMapping(value = "/login", method = RequestMethod.GET)
@ResponseBody
public 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、出错异常记得捕获
登录验证部分
代码如下:
@Override
protected 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、根据获取到的用户信息,也可以进行其它判断,如用户是否激活,是否被禁用等
授权部分
代码如下:
@Override
protected 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);
@Override
protected 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]
示例源码参考
https://github.com/peterchenhdu/spring-shiro-demo
测试
登录:http://localhost:8080/ssd/security/login ----->角色:admin,用户名:admin,密码:21232f297a57a5a743894a0e4a801fc3
权限测试:http://localhost:8080/ssd/users ----->访问成功
权限测试:http://localhost:8080/ssd/test/access ----->访问失败,无访问权限
换个角色登录,修改UserRealm.java里的角色为roler1,重新登录http://localhost:8080/ssd/security/login
权限测试:http://localhost:8080/ssd/users ----->访问成功
权限测试:http://localhost:8080/ssd/test/access ----->访问成功
springmvc集成shiro例子的更多相关文章
- springmvc集成shiro登录失败处理
一般的登录流程会有:用户名不存在,密码错误,验证码错误等.. 在集成shiro后,应用程序的外部访问权限以及访问控制交给了shiro来管理. shiro提供了两个主要功能:认证(Authenticat ...
- SpringMVC集成Shiro、读取数据库操作权限
1.Maven添加Shiro所需的jar包 <dependency> <groupId>org.apache.shiro</groupId> <artifac ...
- springMVC集成 -- shiro(配置)
备注:文中配置基本来自尚硅谷视频教程,也可自行参照shiro官方教程:http://shiro.apache.org/spring.html 1.首先通过maven导入shiro相关依赖jar包,修改 ...
- 【实用小技巧】spring springmvc集成shiro时报 No bean named 'shiroFilter' available
查了网上的,很多情况,不同的解决办法,总归一点就是配置文件加载的问题. 先看下配置文件中的配置 web.xml中的主要配置(这是修改后不在报错的:仅仅修改了一个位置:[classpath:spring ...
- springmvc集成shiro后,session、request是否发生变化
1. 疑问 我们在项目中使用了spring mvc作为MVC框架,shiro作为权限控制框架,在使用过程中慢慢地产生了下面几个疑惑,本篇文章将会带着疑问慢慢地解析shiro源码,从而解开心里面的那点小 ...
- 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 ...
- springmvc简单集成shiro
前言: 有天和同事聊天, 谈起权限管理, 他说他有个同事用shiro用的很溜. 正好现在有个管理平台项目, 有权限控制的需求, 因此想借此机会研究一番. 本文主要简单讲解一下对shiro的一些认识, ...
- Shiro权限框架与SpringMVC集成
1.Shiro整合SpringMVC 我们学习Shiro框架肯定是要应用到Web项目上的,所以我们需要整合Shiro和SpringMVC 整合步骤: 第一步:SpringMVC框架的配置 spring ...
- SpringMVC整合Shiro——(3)
SpringMVC整合Shiro,Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理等功能. 第一步:配置web.xml <!-- 配置Shiro过滤器,先让Shiro ...
随机推荐
- 浏览器怎么添加 Axure扩展程序
步骤 本文以强大如斯的谷歌浏览器来说明,怎么查看Axure原型文件,怎么添加Axure RP扩展程序.Axure RP生成的原型文件,一般都是可以用浏览器打开的, 如:一般都有index.star ...
- Application Request Route实现IIS Server Farms集群负载详解
序言 随着公司业务的发展,后台业务就变的越来越多,然而服务器的故障又像月经一样,时不时的汹涌而至,让我们防不胜防.那么后台的高可用,以及服务器的处理能力就要做一个横向扩展的方案,以使后台业务持续的稳定 ...
- html5中canvas的使用 获取鼠标点击页面上某点的RGB
1.html5中的canvas在IE9中可以跑起来.在IE8则跑不起来,这时候就需要一些东西了. 我推荐这种方法,这样显得代码不乱. <!--[if lt IE9]> <script ...
- HTML5 之拖放(drag与drop)
拖放(Drag 和 drop)是 HTML5 标准的组成部分. 拖放是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. HTML5 拖放实例 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(7)-MVC与EasyUI DataGrid
系列目录 本节知识点 为了符合后面更新后的重构系统,文章于2016-11-1日重写 EasyUI读取MVC后台Json数据 开始实现 我们的系统似乎越来越有趣了 首先从前端入手,开打View下面的Sh ...
- 多线程映射工具——ThreadLocal
ThreadLocal相当于一个Map<Thread, T>,各线程使用自己的线程对象Thread.currentThread()作为键存取数据,但ThreadLocal实际上是一个包装了 ...
- 安卓Design包之TabLayout控件的简单使用
Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的Android Design Support Library,在这个supp ...
- PHP实现查询Memcache内存中的所有键与值
使用Memcache时,我们可以用memcache提供的get方法,通过键查询到当前的数据,但是有时候需要查询内存中所有的键和值,这个时候可以使用下面的代码实现: <?php /** * Cre ...
- PyQt4入门学习笔记(二)
之前第一篇介绍了pyqt4的大小,移动位置,消息提示.这次我们介绍菜单和工具栏 QtGui.QmainWindow这个类可以给我们提供一个创建带有状态栏.工具栏和菜单栏的标准的应用. 状态栏 状态栏是 ...
- ASP.NET MVC5学习笔记01
由于之前在项目中也使用MVC进行开发,但是具体是那个版本就不是很清楚了,但是我觉得大体的思想是相同的,只是版本高的在版本低的基础上增加了一些更加方便操作的东西.下面是我学习ASP.NET MVC5高级 ...