使用Shiro进行权限控制的实现流程

2018-02-27 11:52:01来源:oschina作者:BigData_晓为人点击

分享
一.认识shiro 是一种安全框架。二.使用shiro进行权限控制的流程 Step1: 导入shiro的相关的jar包
Step2: 准备好3个shiro工具类
Md5Util.java 用于对密码进行加密处理
AuthcredentiaMacher.java加密匹配器,用于对输入的明文进行加密处理
AuthRealm.java 材料类,用于给登录提供素材,给权限控制提供素材
Step3:在spring的配置文件中对配置5个bean的,分别是安全管理器,Realm原材料,加密匹配器,权限认证通知,shiro过滤工厂
Step4: 在web.xml中实现配置shiro权限的过滤器
Step5: 在controller实现中登录和登出逻辑的处理
step6: 在对应的jsp中使用shiro标签实现对应内容的权限控制。 三.用shiro实现登录和登出和权限控制

(一)登录的处理


1. 导入权限控制shiro相关的jar包




org.apache.shiro
shiro-all
1.2.3

2. 在spring的配置文件applicationContent-shiro中添加5个bean的配置信息




























/login.action=anno

/staticfile/**=anno

/**authc



3. 在web.xml文件中 配置shiro过滤器





shiroFilter
org.springframework.web.filter.DelegatingFilterProxy


targetFilterLifecycle
true


shiroFilter
/*

4. 在登录controller中创建subject对象


//1.创建Subject
Subject subject = SecurityUtils.getSubject();
//2.创建用户名密码的令牌
UsernamePasswordToken token = new UsernamePasswordToken(userName, password);
//3.登录
try {
//如果成功 则无异常 登录失败会抛出异常
subject.login(token);
//得到详细用户对象存到session中
User user = (User) subject.getPrincipal();
user = userService.findOne(user.getUserId());
session.setAttribute("_CURRENT_USER", user);
return"redirect:/home.action";
} catch (AuthenticationException exception) {//登录失败
model.addAttribute("errorInfo", "用户名或密码错误!");
model.addAttribute("username", userName);
model.addAttribute("password",password);
return "sysadmin/login/login";
}

5. 提前准备好,下面3个类:

在AuthRealm.java类,继承SimpleAccountRealm.java;重写其中的第一个方法,需要传入正确的用户对象,正确的用户密码,原材料的名称public class AuthRealm extends SimpleAccountRealm{
@Autowired
private UserService userService;
//给登录提供素材
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) {
UsernamePasswordToken upToken=(UsernamePasswordToken) token;
//principal:正确的用户对象
User user =userService.findUserByUsername(upToken.getUsername());
//credentials:正确的用户密码
//realmName:原材料类的名称
AuthenticationInfo info=new
SimpleAuthenticationInfo(
user,user.getPassword(),this.getName());
return info;
}
Service层:
@Override
public User findUserByUsername(String username) {
return userMapper.findUserByUsername(username);
}
Dao层:
@Select("select * from user_p where username=#username")
public User findUserByUsername(String username);Md5Utils加密类:public class Md5Utils{
public static String getMd5(String password){
Md5Hash md5Hash = new Md5Hash(password, "tedu", 3);
return md5Hash.toString();
}
}AuthcredentialMacher.java加密匹配器类:在加密匹配器中 把token中明文密码加密成密文放token中//加密匹配器,需要调用Md5Utils对输入的密码进行加密后和数据库中比较验证
public class AuthcredentialMacher extends SimpleCredentialsMatcher{ public boolean doGredentialsMatch(AuthenticationToken token,AuthenticationInfo info){
UsernamePasswordToken uptoken =(UsernamePasswordToken) token;
//对用户输入的密码进行加密
String newPassword = Md5Utils.getMd5(String.valueOf(uptoken.getPassword()));
//把加密后的密码设置回token中
uptoken.setPassword(newPassword.toCharArray());
return super.doCredentialsMatch(token, info);
}

(二)实现shiro进行权限控制

在AuthRealm.java类,继承SimpleAccountRealm.java;重写其中的第二个方法; 给安全管理器提供当前用户有哪些权限//给权限控制提供素材
@Override
protected AuthorizationInfo doGetAuthorizationInfo(
PrincipalCollection principals) {
SimpleAuthorizationInfo info =new SimpleAuthorizationInfo(); User user =(User) principals.getPrimaryPrincipal();
List list =userService.findModuleName(user.getUserId());
info.addStringPermissions(list);
return info;
}

2. 在jsp页面中通过shiro标签对页面进行判断处理 例如: 对这几个模块进行权限控制判断


1) 添加shiro的@taglib头文件
< %@ taglib uri="http://shiro.apache.org/tags" prefix="shiro"%>
2)对需要进行权限判的模块使用shiro标签进行处理


系统首页


货运管理



基础信息


系统管理

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台