您的位置:首页 > 编程语言 > Java开发

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();
}

}
 


 


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: