接上文JAVA学习之springmvc+mybatis集成shiro权限控制(一)
5、创建Realm并编码实现package com.godyang.demo.shiro;
import java.util.Set;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UnknownAccountException;
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 org.apache.shiro.util.ByteSource;
import org.springframework.beans.factory.annotation.Autowired;
import com.godyang.demo.po.ShiroUsers;
import com.godyang.demo.service.ShiroUserService;
public class CustomRealm extends AuthorizingRealm {
@Autowired
private ShiroUserService shiroUserService;
/**
* 授权
*
* @param principalCollection
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// 1、从PrincipalCollection中获取登录的用户信息
ShiroUsers user = (ShiroUsers) principals.getPrimaryPrincipal();
// 2、创建SimpleAuthorizationInfo对象
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
// 3、获取并设置role
Set tt = shiroUserService.findRoles(user.getUsername());
authorizationInfo.setRoles(tt);
// 4、获取并设置Permissions
Set ss = shiroUserService.findPermissions(user.getUsername());
authorizationInfo.setStringPermissions(ss);
return authorizationInfo;
}
/**
* 认证
*
* @param authenticationToken
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
// 1、把AuthenticationToken转换为UsernamePasswordToken
UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
// 2、从UsernamePasswordToken中获取用户名
String username = usernamePasswordToken.getUsername();
// 3、根据用户名获取数据库的用户信息
ShiroUsers shiroUsers = shiroUserService.findByUsername(username);
// 4.如果用户不存在,抛出用户不存在异常
if (shiroUsers == null) {
throw new UnknownAccountException("用户不存在!");// 没找到帐号
}
// 5、根据用户信息,抛出用户锁定异常
if (Boolean.TRUE.equals(false)) {
throw new LockedAccountException("帐号锁定"); // 帐号锁定
}
// 6、根据用户情况,构造AuthenticationInfo并返回
// 以下数据是从数据库获取的
// a、principal用户信息,user实体
Object principal = shiroUsers;
// b、用户密码
Object credentials = shiroUsers.getPassword();
// c、当前realm的getname()
String realmName = getName();
// d、盐值,
ByteSource credentialsSalt = ByteSource.Util.bytes(shiroUsers.getUsername());
SimpleAuthenticationInfo info = null;
info = new SimpleAuthenticationInfo(principal, credentials, credentialsSalt, realmName);
return info;
}
}
6、编码实现登录的方法@RequestMapping(value = "/logincheck")
public String logincheck(String username, String password, Model model, HttpServletRequest request) {
if (username == null || username.equals("")) {
model.addAttribute("userName", "用户名不能为空!");
logger.error("---------------------用户名不能为空!---------------");
return "login/login";
}
if (password == null || password.equals("")) {
model.addAttribute("passwd", "密码不能为空!");
logger.error("---------------------密码不能为空!---------------");
return "login/login";
}
// password = MD5Util.getMD5PwdFromUserNameAndPwd(username, password);
Subject subject = SecurityUtils.getSubject();
if (!subject.isAuthenticated()) {
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
// 记住我
token.setRememberMe(true);
try {
subject.login(token);
} catch (UnknownAccountException e) {
e.printStackTrace();
model.addAttribute("errtxt", "用户名错误!");
logger.error("---------------------用户名错误!---------------");
return "login/login";
} catch (IncorrectCredentialsException e) {
e.printStackTrace();
logger.error("---------------------密码错误!---------------");
model.addAttribute("errtxt", "密码错误");
return "login/login";
} catch (LockedAccountException e) {
e.printStackTrace();
logger.error("---------------------用户被锁定!---------------");
model.addAttribute("errtxt", "用户被锁定");
return "login/login";
} catch (AuthenticationException e) {
e.printStackTrace();
logger.error("---------------------登录失败!---------------");
model.addAttribute("errtxt", "登录失败");
return "login/login";
}
}
return "redirect:/";
}
最后,加入相应的jsp页面,编写controller,基本的springmvc+mybatis集成shiro就完成了!
本文介绍如何使用SpringMVC结合MyBatis和Shiro实现权限控制,包括自定义Realm进行用户认证和授权的过程,以及登录方法的实现。
...&spm=1001.2101.3001.5002&articleId=115783277&d=1&t=3&u=6dc52268dada43ddbd5db13488394d2e)
1万+

被折叠的 条评论
为什么被折叠?



