/** * Copyright (c) 2015-2017, Chill Zhuang 庄骞 (smallchill@163.com). *

* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at *

* http://www.apache.org/licenses/LICENSE-2.0 *

* Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.stylefeng.guns.core.shiro; import com.stylefeng.guns.core.common.constant.Const; import com.stylefeng.guns.core.common.constant.factory.ConstantFactory; import com.stylefeng.guns.core.support.HttpKit; import com.stylefeng.guns.core.util.ToolUtil; import com.stylefeng.guns.modular.system.model.User; import com.stylefeng.guns.modular.system.model.UserInfo; import org.apache.shiro.SecurityUtils; import org.apache.shiro.crypto.hash.Md5Hash; import org.apache.shiro.crypto.hash.SimpleHash; import org.apache.shiro.session.Session; import org.apache.shiro.subject.Subject; import org.apache.shiro.util.ByteSource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.util.List; /** * shiro工具类 * * @author dafei, Chill Zhuang */ public class ShiroKit { private static final String NAMES_DELIMETER = ","; /** * 加盐参数 */ public final static String hashAlgorithmName = "MD5"; /** * 循环次数 */ public final static int hashIterations = 1024; /** * shiro密码加密工具类 * * @param credentials 密码 * @param saltSource 密码盐 * @return */ public static String md5(String credentials, String saltSource) { ByteSource salt = new Md5Hash(saltSource); return new SimpleHash(hashAlgorithmName, credentials, salt, hashIterations).toString(); } /** * 获取随机盐值 * @param length * @return */ public static String getRandomSalt(int length) { return ToolUtil.getRandomString(length); } /** * 获取当前 Subject * * @return Subject */ public static Subject getSubject() { return SecurityUtils.getSubject(); } /** * 获取封装的 ShiroUser * * @return ShiroUser */ public static ShiroUser getUser() { if (isGuest()) { return null; } else { return (ShiroUser) getSubject().getPrincipals().getPrimaryPrincipal(); } } public static UserInfo getUserOne(){ HttpServletRequest request = HttpKit.getRequest(); HttpSession session = request.getSession(); Object obj = session.getAttribute("company"); if(null == obj){ return null; } return (UserInfo)obj; } /** * 从shiro获取session * */ public static Session getSession() { return getSubject().getSession(); } /** * 获取shiro指定的sessionKey * */ @SuppressWarnings("unchecked") public static T getSessionAttr(String key) { Session session = getSession(); return session != null ? (T) session.getAttribute(key) : null; } /** * 设置shiro指定的sessionKey * */ public static void setSessionAttr(String key, Object value) { Session session = getSession(); session.setAttribute(key, value); } /** * 移除shiro指定的sessionKey */ public static void removeSessionAttr(String key) { Session session = getSession(); if (session != null) session.removeAttribute(key); } /** * 验证当前用户是否属于该角色?,使用时与lacksRole 搭配使用 * * @param roleName * 角色名 * @return 属于该角色:true,否则false */ public static boolean hasRole(String roleName) { return getSubject() != null && roleName != null && roleName.length() > 0 && getSubject().hasRole(roleName); } /** * 与hasRole标签逻辑相反,当用户不属于该角色时验证通过。 * * @param roleName * 角色名 * @return 不属于该角色:true,否则false */ public static boolean lacksRole(String roleName) { return !hasRole(roleName); } /** * 验证当前用户是否属于以下任意一个角色。 * * @param roleNames * 角色列表 * @return 属于:true,否则false */ public static boolean hasAnyRoles(String roleNames) { boolean hasAnyRole = false; Subject subject = getSubject(); if (subject != null && roleNames != null && roleNames.length() > 0) { for (String role : roleNames.split(NAMES_DELIMETER)) { if (subject.hasRole(role.trim())) { hasAnyRole = true; break; } } } return hasAnyRole; } /** * 验证当前用户是否属于以下所有角色。 * * @param roleNames * 角色列表 * @return 属于:true,否则false */ public static boolean hasAllRoles(String roleNames) { boolean hasAllRole = true; Subject subject = getSubject(); if (subject != null && roleNames != null && roleNames.length() > 0) { for (String role : roleNames.split(NAMES_DELIMETER)) { if (!subject.hasRole(role.trim())) { hasAllRole = false; break; } } } return hasAllRole; } /** * 验证当前用户是否拥有指定权限,使用时与lacksPermission 搭配使用 * * @param permission * 权限名 * @return 拥有权限:true,否则false */ public static boolean hasPermission(String permission) { return getSubject() != null && permission != null && permission.length() > 0 && getSubject().isPermitted(permission); } /** * 与hasPermission标签逻辑相反,当前用户没有制定权限时,验证通过。 * * @param permission * 权限名 * @return 拥有权限:true,否则false */ public static boolean lacksPermission(String permission) { return !hasPermission(permission); } /** * 已认证通过的用户。不包含已记住的用户,这是与user标签的区别所在。与notAuthenticated搭配使用 * * @return 通过身份验证:true,否则false */ public static boolean isAuthenticated() { return getSubject() != null && getSubject().isAuthenticated(); } /** * 未认证通过用户,与authenticated标签相对应。与guest标签的区别是,该标签包含已记住用户。。 * * @return 没有通过身份验证:true,否则false */ public static boolean notAuthenticated() { return !isAuthenticated(); } /** * 认证通过或已记住的用户。与guset搭配使用。 * * @return 用户:true,否则 false */ public static boolean isUser() { return getSubject() != null && getSubject().getPrincipal() != null; } /** * 验证当前用户是否为“访客”,即未认证(包含未记住)的用户。用user搭配使用 * * @return 访客:true,否则false */ public static boolean isGuest() { return !isUser(); } /** * 输出当前用户信息,通常为登录帐号信息。 * * @return 当前用户信息 */ public static String principal() { if (getSubject() != null) { Object principal = getSubject().getPrincipal(); return principal.toString(); } return ""; } /** * 获取当前用户的部门数据范围的集合 */ public static List getDeptDataScope() { Integer deptId = getUser().getDeptId(); List subDeptIds = ConstantFactory.me().getSubDeptId(deptId); subDeptIds.add(deptId); return subDeptIds; } /** * 判断当前用户是否是超级管理员 */ public static boolean isAdmin() { List roleList = ShiroKit.getUser().getRoleList(); for (Integer integer : roleList) { String singleRoleTip = ConstantFactory.me().getSingleRoleTip(integer); if (singleRoleTip.equals(Const.ADMIN_NAME)) { return true; } } return false; } }