package com.aijia.peixun.config; import com.aijia.peixun.entity.User; import com.aijia.peixun.service.JzPeiXunService; import com.aijia.peixun.utils.Constants; import com.alibaba.fastjson.JSONObject; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.*; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.session.Session; import org.apache.shiro.subject.PrincipalCollection; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import java.util.Collection; import java.util.Objects; public class UserRealm extends AuthorizingRealm { private Logger logger = LoggerFactory.getLogger(UserRealm.class); @Autowired private JzPeiXunService jzPeiXunService; @Override @SuppressWarnings("unchecked") protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { Session session = SecurityUtils.getSubject().getSession(); //查询用户的权限 JSONObject permission = (JSONObject) session.getAttribute(Constants.SESSION_USER_PERMISSION); logger.info("permission的值为:" + permission); logger.info("本用户权限为:" + permission.get("permissionList")); //为当前用户设置角色和权限 SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); authorizationInfo.addStringPermissions((Collection) permission.get("permissionList")); return authorizationInfo; } /** * 验证当前登录的Subject * LoginController.login()方法中执行Subject.login()时 执行此方法 */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException { //获取用户的账号名称 -- 手机号 String loginName = (String) authcToken.getPrincipal(); // 获取用户密码 String password = new String((char[]) authcToken.getCredentials()); User user = new User(); //存储用户名 user.setTelephoneno(loginName); //存储验证码 user.setBackup2(password); //因为是手机号+短息验证码登录,即使没有此手机号账号,也可以登录,可以为null // if (user == null) { // //没找到帐号 // throw new UnknownAccountException(); // } //交给AuthenticatingRealm使用CredentialsMatcher进行密码匹配,如果觉得人家的不好可以自定义实现 SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo( user, // user.getTelephoneno(), user.getBackup2(), //ByteSource.Util.bytes("salt"), salt=username+salt,采用明文访问时,不需要此句 getName() ); //session中不需要保存密码 // user.remove("password"); //将用户信息放入session中 SecurityUtils.getSubject().getSession().setAttribute(Constants.SESSION_USER_INFO, user); System.out.println(authenticationInfo); return authenticationInfo; } public static String getUser(){ Session session = SecurityUtils.getSubject().getSession(); JSONObject userInfo = (JSONObject) session.getAttribute(Constants.SESSION_USER_INFO); if (Objects.isNull(userInfo)) { return null; } return userInfo.getString("username"); } }