码迷,mamicode.com
首页 > 其他好文 > 详细

权限控制

时间:2016-10-18 23:13:30      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:权限管理

权限概述

系统中有很多功能,这些功能并不是每一个登录的用户都能操作的,需要对用户操作系统的能力进行限制,该过程就叫权限

认证:系统提供的标识用户身份的功能(通常实现比如:登录)(告诉系统你是谁?)

授权:系统提供的根据用户的身份赋予其不同的操作系统能力功能(告诉系统你能做什么?)


系统启动 ---->web.xml|--->spring容器--->扫描Action Service Dao

                     |--->OAListener---->通过spring容器中的service加载权限数据

                                                |

                     |--->struts过滤器 --->权限检验拦截器

用户请求    ------------> 加载struts.xml        |

<--------------跳转到权限不足界面---------检验通过执行action

权限模型

权限表:保存系统中所有的需要进行限制的功能,表名auth_function

角色表:权限关联的角色(比如业务员,总裁,经理,总监),auth_role

用户表:t_user

权限角色的映射表:role_function

角色用户的映射表:user_role

权限控制方式

url拦截控制方式(基于拦截器或过滤器)

方法注解控制方式

/**

* 登录

* @return

*/

public String login(){

//获取验证码

String checkcodeBySession = (String) 

ServletActionContext.getRequest().getSession().getAttribute("key");

//校验验证码

if(StringUtils.isNoneBlank(checkcode) && checkcode.equals(checkcodeBySession)){

//验证码通过

//校验用户名和密码

//获取用户名和密码

String username = t.getUsername();

String password = t.getPassword();

if(StringUtils.isNoneBlank(username) && StringUtils.isNoneBlank(password)){

password = MD5Utils.md5(password);

//获取shiro的subject对象

Subject subject = SecurityUtils.getSubject();//未认证的用户对象

//创建用户名和密码令牌

AuthenticationToken authenticationtoken = new UsernamePasswordToken(username,password);

//根据用户对象调用login方法,调用安全管理器进行认证

try {

//登录成功

subject.login(authenticationtoken);

//获取当前用户

User user = (User) subject.getPrincipal();

ServletActionContext.getRequest().getSession().setAttribute("loginUser", user);

return "home";

} catch (Exception e) {

//登录失败

//用户名或密码有误!

this.addActionMessage(this.getText("error.usernameorpassword"));

e.printStackTrace();

}

return "login";

}else{

//用户名或密码有误!

this.addActionMessage(this.getText("error.usernameorpassword"));

return "login";

}

}else{

//验证码有误!

this.addActionMessage(this.getText("error.checknode"));

return "login";

}

}

import javax.annotation.Resource;


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.authc.UsernamePasswordToken;

import org.apache.shiro.authz.AuthorizationInfo;

import org.apache.shiro.authz.SimpleAuthorizationInfo;

import org.apache.shiro.realm.AuthorizingRealm;

import org.apache.shiro.subject.PrincipalCollection;


import cn.itcast.bos.dao.IUserDao;

import cn.itcast.bos.domain.Function;

import cn.itcast.bos.domain.User;

import cn.itcast.bos.service.IFunctionService;


public class BosRealm extends AuthorizingRealm{


@Resource

private IUserDao userDao;

@Resource

private IFunctionService functionService;

@Override

protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {


//获取当前登录用户

User user = (User) principalCollection.getPrimaryPrincipal();

//通过用户名查询用户权限

List<Function> list = functionService.findFunctionByUsername(user.getUsername());

//授权方法

SimpleAuthorizationInfo sai = new SimpleAuthorizationInfo();

if(null != list && list.size()>0){

for(Function function : list){

sai.addStringPermission(function.getCode());

}

}

return sai;

}


@Override

protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {


//获取用户名和密码令牌

UsernamePasswordToken upt = (UsernamePasswordToken)authenticationToken;

//获取用户名和密码

String username = upt.getUsername();

//根据username查询用户

List<User> list = userDao.conditionQuery("findUserByUsername", username);

if(null != list && list.size()>0){

//返回到安全管理器中,安全管理器会校验密码

AuthenticationInfo ai = new SimpleAuthenticationInfo

(list.get(0), list.get(0).getPassword(), this.getClass().getSimpleName());

return ai;

}

return null;

}


}


权限控制

标签:权限管理

原文地址:http://11778969.blog.51cto.com/11768969/1863190

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!