JAVA实现用户的权限管理
2018-08-16 15:52
651 查看
一:写在前面
前两天有个同学问我,那个系统不同的用户登陆不同的页面不同,要写很多个页面啊!而每个用户的在系统中拥有不同的权限,可以访问不同的页面是怎么实现的??那低权限的在浏览器输入高权限的人的url是不是就可以访问了?不能又怎么拦截的呢?我当时欺负他不是学后台开发的,就给他简单说了一下什么分角色赋予不同的权利啦!分角色回显不同的信息啦!什么什么的也不知道他听懂多少,可是现在想想自己还真有点拆,特意写篇博客证明我真会 /呲牙/呲牙二:权限管理简介
做系统时肯定遇到最常见的就是不同的用户的需求是不一样的,就拿登陆来说,一个办公管理系统,不同部门的人肯定要求的功能和权限都是不一样的,那你不可能对每一个部门都写一个登陆页面,给不同的url吧!亦或者在下边选择你是什么部门的人?那每个部门内还有等级呐!再继续选?然后给每个人写一个界面?那明显是不可能的,那我们到底要怎么实现呐?最常用的方法就是划分不同的角色,赋予角色权限,然后再让用户去申请角色就好了,具体的实现慢慢说。
三:数据表的设计
根据角色授权的思想,我们需要涉及五张表(简单一写,没写约束,凑活看吧)1)三张主表
a)用户表(user)
b) 角色表(role)
c) 资源表(module)[你也可以叫他权限表等等,反正就是代表着各种权限]
2)两张中间表
d)用户角色表(user_role)
e)角色资源表(permission)
1 @Override 2 3 protected AuthenticationInfo doGetAuthenticationInfo(AuthticationToken authenticationToken) throws AuthenticationRxception { 4 5 //1.从主体传过来的认证信息中,获取用户名 6 7 String userName = (String)authenticationToken.getPrincipal(); 8 9 //2.通过用户名到数据库获取凭证 10 11 String password = getPasswordByUserName(userName); 12 13 if(password == null){ 14 15 return null; 16 17 } 18 19 SimpleAuthenticationInfo authticationInfo = new SimpleAuthenticationInfo (principal:“xiaoming”,password,realmName:"customRealm"); 20 21 authenticationInfo.setCredentialsSaltSalt(ByteSource.Util.bytes(string:"XQC")); 22 23 return authenticationInfo; 24 25 }加密
五:Shiro在Web项目中的使用
实战中shiro的应用很多,几乎都要用到,这里举一个Blog的登陆的例子,更好的理解和使用。本博客是采用spring+springMVC+Mybatis实现的。1:执行流程
2:登录页面 login.jsp
<!--只截取form表单部分--> <form action="${pageContext.request.contextPath}/blogger/login.do" method="post" onsubmit="return checkForm()"> <DIV style="background: rgb(255, 255, 255); margin: -100px auto auto; border: 1px solid rgb(231, 231, 231); border-image: none; width: 400px; height: 200px; text-align: center;"> <DIV style="width: 165px; height: 96px; position: absolute;"> <DIV class="tou"> </DIV> <DIV class="initial_left_hand" id="left_hand"> </DIV> <DIV class="initial_right_hand" id="right_hand"> </DIV> </DIV> <P style="padding: 30px 0px 10px; position: relative;"> <SPAN class="u_logo"></SPAN> <INPUT id="userName" name="userName" class="ipt" type="text" placeholder="请输入用户名" value="${blogger.userName }"> </P> <P style="position: relative;"> <SPAN class="p_logo"></SPAN> <INPUT id="password" name="password" class="ipt" type="password" placeholder="请输入密码" value="${blogger.password }"> </P> <DIV style="height: 50px; line-height: 50px; margin-top: 30px; border-top-color: rgb(231, 231, 231); border-top-width: 1px; border-top-style: solid;"> <P style="margin: 0px 35px 20px 45px;"> <span><font color="red" id="error">${errorInfo }</font></span> <SPAN style="float: right;"> <input type="submit" style="background: rgb(0, 142, 173); padding: 7px 10px; border-radius: 4px; border: 1px solid rgb(26, 117, 152); border-image: none; color: rgb(255, 255, 255); font-weight: bold;" value="登录"/> </SPAN> </P> </DIV> </DIV> </form>
3:Controller层的控制
package com.xqc.controller; /** * 博主Controller层 * */ @Controller @RequestMapping("/blogger") public class BloggerController { @Resource private BloggerService bloggerService; /** * 用户登录 * @param blogger * @param request * @return */ @RequestMapping("/login") public String login(Blogger blogger,HttpServletRequest request){ Subject subject=SecurityUtils.getSubject(); UsernamePasswordToken token=new UsernamePasswordToken(blogger.getUserName(), CryptographyUtil.md5(blogger.getPassword(), "xqc")); try{ subject.login(token); // 登录验证 return "redirect:/admin/main.jsp"; }catch(Exception e){ e.printStackTrace(); request.setAttribute("blogger", blogger); request.setAttribute("errorInfo", "用户名或密码错误!"); return "login"; } } }
4:在spring的配置文件中添加shiro的过滤器
<!-- Shiro过滤器 --> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <!-- Shiro的核心安全接口,这个属性是必须的 --> <property name="securityManager" ref="securityManager"/> <!-- 身份认证失败,则跳转到登录页面的配置 --> <property name="loginUrl" value="/login.jsp"/> <!-- Shiro连接约束配置,即过滤链的定义 --> <property name="filterChainDefinitions"> <value> /login=anon /admin/**=authc </value> </property> </bean>
5:拦截后交给自定义Realm进行验证。
package com.xqc.realm; import javax.annotation.Resource; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.SimpleAuthenticationInfo; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; import com.xqc.entity.Blogger; import com.xqc.service.BloggerService; /** * 自定义Realm * */ public class MyRealm extends AuthorizingRealm{ @Resource private BloggerService bloggerService; /** * 为当限前登录的用户授予角色和权 */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { return null; } /** * 验证当前登录的用户 */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { String userName=(String)token.getPrincipal(); Blogger blogger=bloggerService.getByUserName(userName); if(blogger!=null){ SecurityUtils.getSubject().getSession().setAttribute("currentUser", blogger); // 当前用户信息存到session中 AuthenticationInfo authcInfo=new SimpleAuthenticationInfo(blogger.getUserName(),blogger.getPassword(),"xx"); return authcInfo; }else{ return null; } } }
6:并用工具类进行加盐
package com.xqc.util; import org.apache.shiro.crypto.hash.Md5Hash; /** * 加密工具 * */ public class CryptographyUtil { /** * Md5加密 * @param str * @param salt * @return */ public static String md5(String str,String salt){ return new Md5Hash(str,salt).toString(); } }
相关文章推荐
- java annotation + springMVC 实现用户角色权限管理
- Java Web入门之用Filter实现用户权限的管理
- 实现业务系统中的用户权限管理--设计篇
- 基于整合了struts 和hibernate 的j2ee 架构的用户权限管理系统的设计与实现
- 实现业务系统中的用户权限管理--实现篇
- 实现业务系统中的用户权限管理--设计篇
- 实现业务系统中的用户权限管理--设计篇
- 实现业务系统中的用户权限管理--实现篇
- 实现业务系统中的用户权限管理--设计篇
- 实现业务系统中的用户权限管理--设计篇
- 实现业务系统中的用户权限管理--实现篇
- Pb中多用户权限管理实现方案
- 实现业务系统中的用户权限管理--实现篇
- Pb中多用户权限管理实现方案
- Pb中多用户权限管理实现方案
- 实现业务系统中的用户权限管理--设计篇
- Pb中多用户权限管理实现方案
- ASP.NET中启用Windows集成验证,怎样在调用System.DirectoryServices下的组件时传递安全上下文,也就是说当前用户凭据,来实现权限管理
- 实现业务系统中的用户权限管理
- 用户权限管理及动态菜单的实现