shiro权限管理框架shiro框架怎么样

您现在的位置: >
第三章 shiro与spring的集成-权限控制
&&& &&& &&&
目录页:《》
shiro的配置文件有两种写法,一个是通过项目加载shiro.ini的方式,另一个便是通过spring进行bean加载的方式,这里螃蟹主要介绍后者。 内容来自
shiro在web项目中的配置,主要有这么八项,我们分别来看一下第一项:权限控制
一、web.xml基础配置
web.xml的配置应该说是家常便饭了,这是只需要添加shiro的过滤器即可,配置如下:
二、spring配置文件
这里的权限控制,是指用户输入可以发送哪些请求。
比如我们知道了后台管理的url,不想通过登陆而直接进入,这时候shiro开始对请求进行过滤,判是否拥有该权限。
先贴出配置代码,然后逐个讲解:
IT学习者()
1)、在上述的配置中有三个url拦截配置,他们的name是固定的
分别为登陆url(&/login&),登陆成功后跳转url(&/success&),没有权限访问的url(&/refuse&)
这三个url的跳转都是由shiro在自行验证,我们也可以自定义,只要name指定好便可以了。
2)、我们再看一下请求过滤
这里主要有四种类型:
authc && 需要通过验证后才能访问
anon && shiro对该类型请求不进行拦截
logout && 退出并进行session销毁
/** = user && &表示访问该地址的用户是身份验证通过或RememberMe登录的都可以。
3)、与其他过滤器进行关联(spring用法)
比如:&key=&authc&&value-ref=&authcFilter& 内容来自
当有请求发送时,会调用id为authcFilter的bean所对应的过滤器,即如下bean类:
4)form表单
authcFilter中配置的value对应的form表单中的元素的name,比如:
这样进行form提交时,shiro便可获取表单中的内容了,而shiroLoginFailure是用于获取shiro中异常(异常处理可参考:《》)的key。
5)将user信息存放到session
&key=&sysUser&&value-ref=&sysUserFilter& 官网:
对应的bean的
添加这么个过滤器,是为了方便我们把user对象的内容存放到session中,该处理因个人喜好,也可不添加,SysUserFilter调用接口如下:
文章除注明转载外,均为原创或编译
欢迎任何形式的转载,但务必请以超链接形式注明出处
本文出自:IT学习者
链接地址:
更多相关资讯
大家好,我是IT学习者-螃蟹,已经有近一周的时间没有更新文章了,作.....
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
Copyright & 2014
All rights reserved.&&
联系方式(QQ): |shiro权限框架简单快速入门
声明本文只适合初学者,本人也是刚接触而已,经过一段时间的研究小有收获,特来分享下希望和大家互相交流学习。
首先配置我们的web.xml代码如下,固定格式,记死就成
&filter-name&shiroFilter&/filter-name&
&filter-class&
org.springframework.web.filter.DelegatingFilterProxy
&/filter-class&
& &/filter&
&filter-mapping&
&filter-name&shiroFilter&/filter-name&
&url-pattern&
protected AuthorizationInfo
doGetAuthorizationInfo(PrincipalCollection principalCollection)
//获取当前登陆的用户名
&&& String
loginName =&
& (String)
principalCollection.fromRealm(getName()).iterator().next();
//根据用户名查找对象
&&& User user =
userService.findByLoginName(loginName);
&&& if(user !=
SimpleAuthorizationInfo info = new
SimpleAuthorizationInfo();
//添加角色(Set集合&字符串&)
info.setRoles(user.getGroupNameSet());
//迭代用户对应的角色集合,为了获取角色对应的权限
for(UserGroup g : user.getUserGroupList()) {
//添加permission
info.addStringPermissions(g.getPermissionStringList());
&&& return
&&& return
protected AuthenticationInfo
doGetAuthenticationInfo(
AuthenticationToken authenticationToken) throws
AuthenticationException {
UsernamePasswordToken token = (UsernamePasswordToken)
authenticationT
//根据用户名去查找对象
&&& User user =
userService.findByLoginName(token.getUsername());
&&& if(user !=
& return new
SimpleAuthenticationInfo(user.getName(),
user.getPassword(),getName());
&&& return
public void setUserService(UserService userService)
this.userService = userS
各部分代码功能上面注释已基本解释了,我要说的是,我们平时有可能比较喜欢使用currUser对象,但是貌似在这里没有办法得到了。其实不然,首先shiro给我们提供的Subject的会话可以满足我们的需求
Session session = subject.getSession();
Session session = subject.getSession(boolean create);
些方法在概念上等同于HttpServletRequest API。第一个方法会返
回Subject的现有会话,或者如果还没有会话,它会创建一个新的并将之返回。
第二个方法接受一个布尔参数,这个参数用于判定会话不存在时是否创建新会话
。一旦获得Shiro的会话,你几乎可以像使用HttpSession一样使用它。Shiro团
队觉得对于Java开发者,HttpSession API用起来太舒服了,所以我们保留了它
的很多感觉。当然,最大的不同在于,你可以在任何应用中使用Shiro会话,不
仅限于Web应用。
因此你可以再验证登陆里写这样的一句话来完成我们的代码转换
SecurityUtils.getSubject().getSession().setAttribute("currUser",
注意在异常处理里需要移除次currUser。
当然官方推挤使用Subject&currentUser&=&SecurityUtils.getSubject();
利用这个currentUser可以方便根据权限确定用户的操作。此用法请参考
文中有详细说明,我这里只说简单部分。
最后就是我们的Controller了。
在这里我介绍登陆和退出
@RequestMapping("/user/login")
public String login(User user,HttpSession session)
&SecurityUtils.getSubject().login(new
UsernamePasswordToken(user.getName(),
user.getPassword()));
&return "redirect:/index";
&& &} catch
(AuthenticationException e) {
&session.setAttribute("msg","用户密码错误或用户名不存在");
&return "redirect:/user/tologin";
@RequestMapping("/user/exit")
public String exit() {
SecurityUtils.getSubject().logout();
&&& return
"redirect:/user/login";
好了,这样基本算是完成任务了,接下来就是页面上的操作了。为此shiro还提供了相应的标签,在这里我就照搬官方的了,因为这个实在简单,大家一看就明白
引用&%@&taglib&prefix="shiro"&uri="http://shiro.apache.org/tags"&%&
guest标签&
验证当前用户是否为“访客”,即未认证(包含未记住)的用户
认证通过或已记住的用户
authenticated标签&
已认证通过的用户。不包含已记住的用户,这是与user标签的区别所在。
notAuthenticated标签&
未认证通过用户,与authenticated标签相对应。与guest标签的区别是,该标签包含已记住用户。
输出当前用户信息,通常为登录帐号信息
hasRole标签&
验证当前用户是否属于该角色
lacksRole标签&
与hasRole标签逻辑相反,当用户不属于该角色时验证通过
hasAnyRole标签&
验证当前用户是否属于以下任意一个角色。
hasPermission标签&
验证当前用户是否拥有制定权限
lacksPermission标签&
与hasPermission标签逻辑相反,当前用户没有制定权限时,验证通过&
还有一个重要的就是数据库的设计,我把图贴出来大家一看也就明白了,我在这里简单的描述下吧
user == subject:用户,
group(role):角色
permission:权限(拥有权限比较细的情况,一般只要user和group就满足要求了)
最后 提一下jar包,别弄错了。是shiro-all.jar。可以从官网下载
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。SpringMVC+Shiro权限管理
&什么是权限呢?举个简单的例子:我有一个论坛,注册的用户分为normal用户,manager用户。对论坛的帖子的操作有这些:添加,删除,更新,查看,回复我们规定:normal用户只能:添加,查看,回复manager用户可以:删除,更新normal,manager对应的是角色(role)添加,删除,更新等对应的是权限(permission)我们采用下面的逻辑创建权限表结构(不是绝对的,根据需要修改)一个用户可以有多种角色(normal,manager,admin等等)一个角色可以有多个用户(user1,user2,user3等等)一个角色可以有多个权限(save,update,delete,query等等)一个权限只属于一个角色(delete只属于manager角色)
&我们创建四张表:t_user用户表:设置了3个用户-------------------------------id + username&&&+ password---+----------------+----------1&&+&&&tom & & & & & +&&0000002&&+&&&jack & & & & & +&&0000003&&+&&&rose & & & & &+&&000000---------------------------------t_role角色表:设置3个角色--------------id + rolename&---+----------1&&+ admin2&&+ manager3&&+ normal--------------t_user_role用户角色表:tom是admin和normal角色,jack是manager和normal角色,rose是normal角色---------------------user_id&&+&&role_id-----------+-----------1 & & & & & &+ & & 11 & & & & & &+ & & 32 & & & & & &+ & & 22 & & & & & &+ & & 33 & & & & & &+ & & 3---------------------t_permission权限表:admin角色可以删除,manager角色可以添加和更新,normal角色可以查看-----------------------------------id&&+&&permissionname&&+&&role_id----+------------------------+-----------1&&&+&&&add & & & & & & & & & & + & & 22&&&+&&&del & & & & & & & & & & & + & &13&&&+&&&update & & & & & & & &+ & & 24&&&+&&&query & & & & & & & & & + & &3-----------------------------------
&建立对应的POJO:
Java代码&&
package&.&&
import&java.util.HashS&&
import&java.util.L&&
import&java.util.S&&
import&javax.persistence.E&&
import&javax.persistence.GeneratedV&&
import&javax.persistence.GenerationT&&
import&javax.persistence.Id;&&
import&javax.persistence.JoinC&&
import&javax.persistence.JoinT&&
import&javax.persistence.ManyToM&&
import&javax.persistence.T&&
import&javax.persistence.T&&
import&org.hibernate.validator.constraints.NotE&&
@Table(name="t_user")&&
public&class&User&{&&
&&&&private&Integer&&&
&&&&@NotEmpty(message="用户名不能为空")&&
&&&&private&String&&&
&&&&@NotEmpty(message="密码不能为空")&&
&&&&private&String&&&
&&&&private&List&Role&&roleL
&&&&@GeneratedValue(strategy=GenerationType.IDENTITY)&&
&&&&public&Integer&getId()&{&&
&&&&&&&&return&&&
&&&&public&void&setId(Integer&id)&{&&
&&&&&&&&this.id&=&&&
&&&&public&String&getUsername()&{&&
&&&&&&&&return&&&
&&&&public&void&setUsername(String&username)&{&&
&&&&&&&&this.username&=&&&
&&&&public&String&getPassword()&{&&
&&&&&&&&return&&&
&&&&public&void&setPassword(String&password)&{&&
&&&&&&&&this.password&=&&&
&&&&@ManyToMany&&
&&&&@JoinTable(name="t_user_role",joinColumns={@JoinColumn(name="user_id")},inverseJoinColumns={@JoinColumn(name="role_id")})&&
&&&&public&List&Role&&getRoleList()&{&&
&&&&&&&&return&roleL&&
&&&&public&void&setRoleList(List&Role&&roleList)&{&&
&&&&&&&&this.roleList&=&roleL&&
&&&&@Transient&&
&&&&public&Set&String&&getRolesName(){&&
&&&&&&&&List&Role&&roles=getRoleList();&&
&&&&&&&&Set&String&&set=new&HashSet&String&();&&
&&&&&&&&for&(Role&role&:&roles)&{&&
&&&&&&&&&&&&set.add(role.getRolename());&&
&&&&&&&&}&&
&&&&&&&&return&&&
Java代码&&
package&.&&
import&java.util.ArrayL&&
import&java.util.L&&
import&javax.persistence.E&&
import&javax.persistence.GeneratedV&&
import&javax.persistence.GenerationT&&
import&javax.persistence.Id;&&
import&javax.persistence.JoinC&&
import&javax.persistence.JoinT&&
import&javax.persistence.ManyToM&&
import&javax.persistence.OneToM&&
import&javax.persistence.T&&
import&javax.persistence.T&&
@Table(name="t_role")&&
public&class&Role&{&&
&&&&private&Integer&&&
&&&&private&String&&&
&&&&private&List&Permission&&permissionL
&&&&private&List&User&&userL
&&&&@GeneratedValue(strategy=GenerationType.IDENTITY)&&
&&&&public&Integer&getId()&{&&
&&&&&&&&return&&&
&&&&public&void&setId(Integer&id)&{&&
&&&&&&&&this.id&=&&&
&&&&public&String&getRolename()&{&&
&&&&&&&&return&&&
&&&&public&void&setRolename(String&rolename)&{&&
&&&&&&&&this.rolename&=&&&
&&&&@OneToMany(mappedBy="role")&&
&&&&public&List&Permission&&getPermissionList()&{&&
&&&&&&&&return&permissionL&&
&&&&public&void&setPermissionList(List&Permission&&permissionList)&{&&
&&&&&&&&this.permissionList&=&permissionL&&
&&&&@ManyToMany&&
&&&&@JoinTable(name="t_user_role",joinColumns={@JoinColumn(name="role_id")},inverseJoinColumns={@JoinColumn(name="user_id")})&&
&&&&public&List&User&&getUserList()&{&&
&&&&&&&&return&userL&&
&&&&public&void&setUserList(List&User&&userList)&{&&
&&&&&&&&this.userList&=&userL&&
&&&&@Transient&&
&&&&public&List&String&&getPermissionsName(){&&
&&&&&&&&List&String&&list=new&ArrayList&String&();&&
&&&&&&&&List&Permission&&perlist=getPermissionList();&&
&&&&&&&&for&(Permission&per&:&perlist)&{&&
&&&&&&&&&&&&list.add(per.getPermissionname());&&
&&&&&&&&}&&
&&&&&&&&return&&&
Java代码&&
package&.&&
import&javax.persistence.E&&
import&javax.persistence.GeneratedV&&
import&javax.persistence.GenerationT&&
import&javax.persistence.Id;&&
import&javax.persistence.JoinC&&
import&javax.persistence.ManyToO&&
import&javax.persistence.T&&
@Table(name="t_permission")&&
public&class&Permission&{&&
&&&&private&Integer&&&
&&&&private&String&&&
&&&&private&Role&
&&&&@GeneratedValue(strategy=GenerationType.IDENTITY)&&
&&&&public&Integer&getId()&{&&
&&&&&&&&return&&&
&&&&public&void&setId(Integer&id)&{&&
&&&&&&&&this.id&=&&&
&&&&public&String&getPermissionname()&{&&
&&&&&&&&return&&&
&&&&public&void&setPermissionname(String&permissionname)&{&&
&&&&&&&&this.permissionname&=&&&
&&&&@ManyToOne&&
&&&&@JoinColumn(name="role_id")&&
&&&&public&Role&getRole()&{&&
&&&&&&&&return&&&
&&&&public&void&setRole(Role&role)&{&&
&&&&&&&&this.role&=&&&
&使用SHIRO的步骤:1,导入jar2,配置web.xml3,建立dbRelm4,在Spring中配置pom.xml中配置如下:
&&xsi:schemaLocation="http://maven.apache.org/POM/4.0.0&http://maven.apache.org/maven-v4_0_0.xsd"
&&&&&&&&&&
&&&&&&&&&&
&&&&&&&&&&
&&&&&&&&&&&&
&&&&&&&&&&&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&
&&&&&&&&&&&&
&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&
&&&&&&&&&&
&web.xml中的配置:
&&&&xmlns="/xml/ns/javaee"&&&
&&&&xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&&&
&&&&xsi:schemaLocation="/xml/ns/javaee&&&
&&&&/xml/ns/javaee/web-app_2_5.xsd"
&&&&&&&&org.springframework.web.context.ContextLoaderListener&&
Java代码&&
package&.&&
import&java.util.L&&
import&javax.inject.I&&
import&org.apache.shiro.authc.AuthenticationE&&
import&org.apache.shiro.authc.AuthenticationI&&
import&org.apache.shiro.authc.AuthenticationT&&
import&org.apache.shiro.authc.SimpleAuthenticationI&&
import&org.apache.shiro.authc.UsernamePasswordT&&
import&org.apache.shiro.authz.AuthorizationI&&
import&org.apache.shiro.authz.SimpleAuthorizationI&&
import&org.apache.shiro.realm.AuthorizingR&&
import&org.apache.shiro.subject.PrincipalC&&
import&org.springframework.stereotype.S&&
import&org.springframework.transaction.annotation.T&&
import&.pojo.R&&
import&.pojo.U&&
@Service&&
@Transactional&&
public&class&MyShiro&extends&AuthorizingRealm{&&
&&&&@Inject&&
&&&&private&UserService&userS&&
&&&&@Override&&
&&&&protected&AuthorizationInfo&doGetAuthorizationInfo(PrincipalCollection&principalCollection)&{&&
&&&&&&&&String&loginName=(String)&principalCollection.fromRealm(getName()).iterator().next();&&
&&&&&&&&User&user=userService.findByName(loginName);&&
&&&&&&&&if(user!=null){&&
&&&&&&&&&&&&
&&&&&&&&&&&&SimpleAuthorizationInfo&info=new&SimpleAuthorizationInfo();&&
&&&&&&&&&&&&
&&&&&&&&&&&&info.setRoles(user.getRolesName());&&
&&&&&&&&&&&&
&&&&&&&&&&&&List&Role&&roleList=user.getRoleList();&&
&&&&&&&&&&&&for&(Role&role&:&roleList)&{&&
&&&&&&&&&&&&&&&&info.addStringPermissions(role.getPermissionsName());&&
&&&&&&&&&&&&}&&
&&&&&&&&&&&&return&&&
&&&&&&&&}&&
&&&&&&&&return&&&
&&&&@Override&&
&&&&protected&AuthenticationInfo&doGetAuthenticationInfo(&&
&&&&&&&&&&&&AuthenticationToken&authenticationToken)&throws&AuthenticationException&{&&
&&&&&&&&UsernamePasswordToken&token=(UsernamePasswordToken)&authenticationT&&
&&&&&&&&User&user=userService.findByName(token.getUsername());&&
&&&&&&&&if(user!=null){&&
&&&&&&&&&&&&
&&&&&&&&&&&&return&new&SimpleAuthenticationInfo(user.getUsername(),&user.getPassword(),&getName());&&
&&&&&&&&}&&
&&&&&&&&return&&&
&在spring的配置文件中配置,为了区别spring原配置和shiro我们将shiro的配置独立出来。
applicationContext-shiro.xml
&&&&&&&xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&&
&&&&&&&xmlns:aop="http://www.springframework.org/schema/aop"&&
&&&&&&&xmlns:tx="http://www.springframework.org/schema/tx"&&
&&&&&&&xmlns:context="http://www.springframework.org/schema/context"&&
&&&&&&&xsi:schemaLocation="&&
http://www.springframework.org/schema/beans&http://www.springframework.org/schema/beans/spring-beans.xsd&&
http://www.springframework.org/schema/tx&http://www.springframework.org/schema/tx/spring-tx.xsd&&
http://www.springframework.org/schema/aop&http://www.springframework.org/schema/aop/spring-aop.xsd&&
http://www.springframework.org/schema/context&http://www.springframework.org/schema/context/spring-context.xsd"
&&&&&&&&&&&&
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&/static/**=anon&&
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&/user=perms[user:query]&&
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&/user/add=roles[manager]&&
&&&&&&&&&&&&&&&&/user/del/**=roles[admin]&&
&&&&&&&&&&&&&&&&/user/edit/**=roles[manager]&&
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&/**&=&authc&&
&&&&&&&&&&&&
&用于登录,登出,权限跳转的控制:
Java代码&&
package&.&&
import&javax.validation.V&&
import&org.apache.shiro.SecurityU&&
import&org.apache.shiro.authc.AuthenticationE&&
import&org.apache.shiro.authc.UsernamePasswordT&&
import&org.springframework.stereotype.C&&
import&org.springframework.ui.M&&
import&org.springframework.validation.BindingR&&
import&org.springframework.web.bind.annotation.RequestM&&
import&org.springframework.web.bind.annotation.RequestM&&
import&org.springframework.web.servlet.mvc.support.RedirectA&&
import&.pojo.U&&
@Controller&&
public&class&HomeController&{&&
&&&&@RequestMapping(value="/login",method=RequestMethod.GET)&&
&&&&public&String&loginForm(Model&model){&&
&&&&&&&&model.addAttribute("user",&new&User());&&
&&&&&&&&return&"/login";&&
&&&&@RequestMapping(value="/login",method=RequestMethod.POST)&&
&&&&public&String&login(@Valid&User&user,BindingResult&bindingResult,RedirectAttributes&redirectAttributes){&&
&&&&&&&&try&{&&
&&&&&&&&&&&&if(bindingResult.hasErrors()){&&
&&&&&&&&&&&&&&&&return&"/login";&&
&&&&&&&&&&&&}&&
&&&&&&&&&&&&
&&&&&&&&&&&&SecurityUtils.getSubject().login(new&UsernamePasswordToken(user.getUsername(),&user.getPassword()));&&
&&&&&&&&&&&&return&"redirect:/user";&&
&&&&&&&&}&catch&(AuthenticationException&e)&{&&
&&&&&&&&&&&&redirectAttributes.addFlashAttribute("message","用户名或密码错误");&&
&&&&&&&&&&&&return&"redirect:/login";&&
&&&&&&&&}&&
&&&&@RequestMapping(value="/logout",method=RequestMethod.GET)&&&&
&&&&public&String&logout(RedirectAttributes&redirectAttributes&){&&&
&&&&&&&&SecurityUtils.getSubject().logout();&&&&
&&&&&&&&redirectAttributes.addFlashAttribute("message",&"您已安全退出");&&&&
&&&&&&&&return&"redirect:/login";&&
&&&&@RequestMapping("/403")&&
&&&&public&String&unauthorizedRole(){&&
&&&&&&&&return&"/403";&&
&三个主要的JSP:login.jsp:
Html代码&&
&!DOCTYPE&HTML&PUBLIC&"-//W3C//DTD&HTML&4.01&Transitional//EN"
&&&&&&&&用户名:
&&&&&&&&密&&&码:
&user.jsp:
Html代码&&
&!DOCTYPE&HTML&PUBLIC&"-//W3C//DTD&HTML&4.01&Transitional//EN"
&&&&&&&&&&&&
&&&&&&&&$(function(){&&
&&&&&&&&&&&&$(".del").click(function(){&&
&&&&&&&&&&&&&&&&var&id=$(this).attr("ref");&&
&&&&&&&&&&&&&&&&$.ajax({&&
&&&&&&&&&&&&&&&&&&&&type:"delete",&&
&&&&&&&&&&&&&&&&&&&&url:"/user/del/"+id,&&
&&&&&&&&&&&&&&&&&&&&success:function(e){&&
&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&});&&
&&&&&&&&&&&&});&&
&&&&&&&&});&&
Html代码&&
&!DOCTYPE&HTML&PUBLIC&"-//W3C//DTD&HTML&4.01&Transitional//EN"
阅读(...) 评论()<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&}

我要回帖

更多关于 安全框架 shiro 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信