基于AOP实现权限管理:通过shiro认证身份和模拟授权认证
2014-02-25 16:09
786 查看
有记录和总结的学习,才是完整的学习。不能总是低头忙于平台项目的开发,更重要的是在学习过程中思考和总结,颗粒归仓,一年之计在于秋。
身份认证和授权认证是权限管理中的核心模块。本文讲讲通过安全框架shiro进行身份认证和模拟授权认证,并可以看到授权之后的效果。
该权限系统是基于角色的RBAC模型。所以查询该用户具有的操作权限,其实是根据该用户所具有的角色查询的。
而缓存到本地,是为了提高性能。基于AOP的实现,是在Struts和页面端之间做权限验证,用大帅的话是“在它们之间插一杠子”。每次访问Action之前,判断该用户是否具有这个操作权限,只有具有操作权限才能访问Action。当用户登录时,如果把该用户具有的操作权限全部查询出来,缓存到本地,以后只需要根据这个缓存做判断即可,这样远比每次都到数据库中查询的效率要高得多。
登录时需要做的事情:
1、用户名和密码的匹配
2、查询该用户具有的操作权限,缓存到本地
根据权限,显示页面
admin用户,具有admin角色。
admin角色,具有对“用户管理”的“添加”、“删除”、“修改”的权限
所以,admin登录后可看到的页面时这样的
使用test账号登录
根据权限,显示页面
test用户,具有test角色。
test角色,只有对“用户管理”的“添加”的权限
所以,test登录后可看到的页面时这样的(只能看到添加按钮,并且也只能执行查询和添加操作)
由图可看出,权限控制粒度到了页面菜单及页面中按钮。
shiro、spring security。我用的是apache的shiro,如果想学习,可参考之前的系列文章。
plaincopy
<span style="font-size:18px;">@Override
protectedAuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken)
throwsAuthenticationException {
//验证 验证码
//........
//验证 用户名和密码
UsernamePasswordTokentoken = (UsernamePasswordToken)authcToken;
//从数据库中查询用户用信息
Useruser = userService.get(token.getUsername());
ShiroUsershiroUser = new ShiroUser(user.getUsername(), user.getRealname());
if(user != null) {
returnnew SimpleAuthenticationInfo(shiroUser,user.getPassword(),
ByteSource.Util.bytes(user.getPassword()),getName());
}</span>
这相当于对 登录用户信息的匹配过程,只是这个匹配过程交给了shiro去完成。
Authentication认证之后,会进行Authorization认证,进而只能进行自己权限范围内的操作。
plaincopy
<span style="font-size:18px;">@Override
protectedAuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
System.out.println("由于加入了缓存, 此处只会load一次:doGetAuthorizationInfo.................");
//得到doGetAuthenticationInfo 方法中传入的凭证
ShiroUsershiroUser = (ShiroUser) principals.fromRealm(getName()).iterator().next();
StringuserName = shiroUser.getName();
if(StringUtils.equals("admin",userName)) {
SimpleAuthorizationInfoinfo = new SimpleAuthorizationInfo();
//这个就是页面中<shiro:hasRole>标签的name的值
info.addRole("admin");
//这个就是页面中<shiro:hasPermission> 标签的name的值
info.addStringPermission("user:view");
info.addStringPermission("user:add");
info.addStringPermission("user:edit");
info.addStringPermission("user:delete");
returninfo;
} elseif(StringUtils.equals("test", userName)) {
SimpleAuthorizationInfoinfo = new SimpleAuthorizationInfo();
//这个就是页面中<shiro:hasRole>标签的name的值
info.addRole("test");
//这个就是页面中<shiro:hasPermission> 标签的name的值
info.addStringPermission("user:view");
info.addStringPermission("user:add");
returninfo;
} else{
returnnull;
}
}</span>
这里的permission字符串就是权限标识,比如“user:add”表示对user模块具有add的权限。在shiro标签和shiro注解中,就是通过这个标识来完成验证的。
[html] view
plaincopy
<span style="font-size:18px;"><divclassdivclass="panelBar">
<ulclassulclass="toolBar">
<shiro:hasPermission name="user:add">
<li><aclassaclass="add" href="${contextPath}/user/preAddUser"target="dialog" rel="lookup2organization_add"mask="true" width="530"height="330"><span>添加</span></a></li>
</shiro:hasPermission>
<shiro:hasPermission name="user:delete">
<li><atitleatitle="确实要删除这些记录吗?" target="selectedTodo"rel="userIds" href="${contextPath}/user/delManyUser"class="delete"><span>删除</span></a></li>
</shiro:hasPermission>
<shiro:hasPermission name="user:edit">
<li><aclassaclass="edit"href="${contextPath}/user/preUpdateUser?userId={sid_user}"rel="lookup2organization_edit" target="dialog"mask="true" warn="请选择一个用户"><span>修改</span></a></li>
</shiro:hasPermission>
</ul>
</div></span>
通过shiro标签,的确可以让用户只看到自己权限范围之内的页面元素,但这并不是很安全,因为页面端的这些输入信息可以别篡改,就像做输入验证一样,在页面通过js验证后,在java代码还需要验证一样。
[java] view
plaincopy
<span style="font-size:18px;">// 添加用户
@RequiresPermissions("user:add")
publicvoid add(){
Stringmsg;
try {
userService.save(user);
msg=AjaxObject.newOk("添加成功").setNavTabId("userListView").toString();
}catch (ServiceException e) {
msg =AjaxObject.newError(e.getMessage()).setNavTabId("userListView").setCallbackType("").toString();
}
outMsg(msg);
}</span>
授权认证,这里是使用静态数据来模拟的,如果想得到数据库中的数据,涉及到Role、Modul、Permission、Organization模块,而我们项目组正在开发之中。。。后文会有讲解,敬请期待。
更多0
上一篇:基于AOP实现权限管理:访问控制模型RBAC和ACL下一篇:DWZ (JUI) 应用实例(三):修改源码,实现自动刷新当前层
身份认证和授权认证是权限管理中的核心模块。本文讲讲通过安全框架shiro进行身份认证和模拟授权认证,并可以看到授权之后的效果。
认证
登录模块,在完成用户名和密码的匹配基础上,查询该用户具有的操作权限,缓存到本地。该权限系统是基于角色的RBAC模型。所以查询该用户具有的操作权限,其实是根据该用户所具有的角色查询的。
而缓存到本地,是为了提高性能。基于AOP的实现,是在Struts和页面端之间做权限验证,用大帅的话是“在它们之间插一杠子”。每次访问Action之前,判断该用户是否具有这个操作权限,只有具有操作权限才能访问Action。当用户登录时,如果把该用户具有的操作权限全部查询出来,缓存到本地,以后只需要根据这个缓存做判断即可,这样远比每次都到数据库中查询的效率要高得多。
用例子来说明
使用admin账号登录登录时需要做的事情:
1、用户名和密码的匹配
2、查询该用户具有的操作权限,缓存到本地
根据权限,显示页面
admin用户,具有admin角色。
admin角色,具有对“用户管理”的“添加”、“删除”、“修改”的权限
所以,admin登录后可看到的页面时这样的
使用test账号登录
根据权限,显示页面
test用户,具有test角色。
test角色,只有对“用户管理”的“添加”的权限
所以,test登录后可看到的页面时这样的(只能看到添加按钮,并且也只能执行查询和添加操作)
由图可看出,权限控制粒度到了页面菜单及页面中按钮。
看看是如何实现的
在java开源的海洋,我们要做什么,几乎都有现成的东西供我们使用,当然基于AOP实现的权限管理也不例外,比如我们可以使用apacheshiro、spring security。我用的是apache的shiro,如果想学习,可参考之前的系列文章。
Authentication认证
[java] viewplaincopy
<span style="font-size:18px;">@Override
protectedAuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken)
throwsAuthenticationException {
//验证 验证码
//........
//验证 用户名和密码
UsernamePasswordTokentoken = (UsernamePasswordToken)authcToken;
//从数据库中查询用户用信息
Useruser = userService.get(token.getUsername());
ShiroUsershiroUser = new ShiroUser(user.getUsername(), user.getRealname());
if(user != null) {
returnnew SimpleAuthenticationInfo(shiroUser,user.getPassword(),
ByteSource.Util.bytes(user.getPassword()),getName());
}</span>
这相当于对 登录用户信息的匹配过程,只是这个匹配过程交给了shiro去完成。
Authentication认证之后,会进行Authorization认证,进而只能进行自己权限范围内的操作。
模拟Authorization认证
[java] viewplaincopy
<span style="font-size:18px;">@Override
protectedAuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
System.out.println("由于加入了缓存, 此处只会load一次:doGetAuthorizationInfo.................");
//得到doGetAuthenticationInfo 方法中传入的凭证
ShiroUsershiroUser = (ShiroUser) principals.fromRealm(getName()).iterator().next();
StringuserName = shiroUser.getName();
if(StringUtils.equals("admin",userName)) {
SimpleAuthorizationInfoinfo = new SimpleAuthorizationInfo();
//这个就是页面中<shiro:hasRole>标签的name的值
info.addRole("admin");
//这个就是页面中<shiro:hasPermission> 标签的name的值
info.addStringPermission("user:view");
info.addStringPermission("user:add");
info.addStringPermission("user:edit");
info.addStringPermission("user:delete");
returninfo;
} elseif(StringUtils.equals("test", userName)) {
SimpleAuthorizationInfoinfo = new SimpleAuthorizationInfo();
//这个就是页面中<shiro:hasRole>标签的name的值
info.addRole("test");
//这个就是页面中<shiro:hasPermission> 标签的name的值
info.addStringPermission("user:view");
info.addStringPermission("user:add");
returninfo;
} else{
returnnull;
}
}</span>
这里的permission字符串就是权限标识,比如“user:add”表示对user模块具有add的权限。在shiro标签和shiro注解中,就是通过这个标识来完成验证的。
shiro标签在页面中的应用
在jsp中,通过shiro标签实现对用户管理模块的权限控制[html] view
plaincopy
<span style="font-size:18px;"><divclassdivclass="panelBar">
<ulclassulclass="toolBar">
<shiro:hasPermission name="user:add">
<li><aclassaclass="add" href="${contextPath}/user/preAddUser"target="dialog" rel="lookup2organization_add"mask="true" width="530"height="330"><span>添加</span></a></li>
</shiro:hasPermission>
<shiro:hasPermission name="user:delete">
<li><atitleatitle="确实要删除这些记录吗?" target="selectedTodo"rel="userIds" href="${contextPath}/user/delManyUser"class="delete"><span>删除</span></a></li>
</shiro:hasPermission>
<shiro:hasPermission name="user:edit">
<li><aclassaclass="edit"href="${contextPath}/user/preUpdateUser?userId={sid_user}"rel="lookup2organization_edit" target="dialog"mask="true" warn="请选择一个用户"><span>修改</span></a></li>
</shiro:hasPermission>
</ul>
</div></span>
shiro注解在action中的应用
在java代码中,通过shiro注解实现对用户管理模块的权限控制通过shiro标签,的确可以让用户只看到自己权限范围之内的页面元素,但这并不是很安全,因为页面端的这些输入信息可以别篡改,就像做输入验证一样,在页面通过js验证后,在java代码还需要验证一样。
[java] view
plaincopy
<span style="font-size:18px;">// 添加用户
@RequiresPermissions("user:add")
publicvoid add(){
Stringmsg;
try {
userService.save(user);
msg=AjaxObject.newOk("添加成功").setNavTabId("userListView").toString();
}catch (ServiceException e) {
msg =AjaxObject.newError(e.getMessage()).setNavTabId("userListView").setCallbackType("").toString();
}
outMsg(msg);
}</span>
授权认证,这里是使用静态数据来模拟的,如果想得到数据库中的数据,涉及到Role、Modul、Permission、Organization模块,而我们项目组正在开发之中。。。后文会有讲解,敬请期待。
更多0
上一篇:基于AOP实现权限管理:访问控制模型RBAC和ACL下一篇:DWZ (JUI) 应用实例(三):修改源码,实现自动刷新当前层
相关文章推荐
- springmvc+shiro+maven 实现登录认证与权限授权管理
- nutz基于shiro实现身份认证和权限认证
- springmvc+shiro+maven 实现登录认证与权限授权管理 201
- springmvc+shiro+maven 实现登录认证与权限授权管理
- 将 Shiro 作为应用的权限基础 三:基于注解实现的授权认证过程
- web中采用shiro实现登录认证与权限授权管理
- springmvc+shiro+maven 实现登录认证与权限授权管理
- BOS项目练习(权限/角色/用户管理(CRUD),基于数据库实现动态授权,ehcache缓存权限,shiro标签,菜单权限展示)
- 将 Shiro 作为应用的权限基础 三:基于注解实现的授权认证过程
- 通过shiro认证身份和模拟授权认证
- springmvc+shiro+maven 实现登录认证与权限授权管理
- 采用shiro实现登录认证与权限授权管理
- 框架 day54 BOS项目练习(权限/角色/用户管理(CRUD),基于数据库实现动态授权,ehcache缓存权限,shiro标签,菜单权限展示)
- 基于shiro的权限管理-002授权
- 【权限管理】基于shiro的权限管理开发实现
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例
- 系统权限管理的简介及基于shiro实现权限管理
- 基于AOP实现权限管理:访问控制模型RBAC和ACL
- 本文主要介绍使用SpringBoot与shiro实现基于数据库的细粒度动态权限管理系统实例。
- 基于X.509证书和SSL协议的身份认证过程实现(OpenSSL可以自己产生证书,有TCP通过SSL进行实际安全通讯的实际编程代码)good