/**
|
* Copyright (c) 2015-2017, Chill Zhuang 庄骞 (smallchill@163.com).
|
* <p>
|
* 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
|
* <p>
|
* http://www.apache.org/licenses/LICENSE-2.0
|
* <p>
|
* 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.beetl;
|
|
import org.apache.shiro.SecurityUtils;
|
import org.apache.shiro.subject.Subject;
|
import org.beetl.core.GroupTemplate;
|
|
import com.stylefeng.guns.core.shiro.ShiroUser;
|
|
public class ShiroExt {
|
private static final String NAMES_DELIMETER = ",";
|
|
/**
|
* 获取当前 Subject
|
*
|
* @return Subject
|
*/
|
protected static Subject getSubject() {
|
return SecurityUtils.getSubject();
|
}
|
|
/**
|
* 获取封装的 ShiroUser
|
*
|
* @return ShiroUser
|
*/
|
public ShiroUser getUser() {
|
if (isGuest()) {
|
return null;
|
} else {
|
return (ShiroUser) getSubject().getPrincipals().getPrimaryPrincipal();
|
}
|
}
|
|
/**
|
* 验证当前用户是否属于该角色?,使用时与lacksRole 搭配使用
|
*
|
* @param roleName 角色名
|
* @return 属于该角色:true,否则false
|
*/
|
public boolean hasRole(String roleName) {
|
return getSubject() != null && roleName != null
|
&& roleName.length() > 0 && getSubject().hasRole(roleName);
|
}
|
|
/**
|
* 与hasRole标签逻辑相反,当用户不属于该角色时验证通过。
|
*
|
* @param roleName 角色名
|
* @return 不属于该角色:true,否则false
|
*/
|
public boolean lacksRole(String roleName) {
|
return !hasRole(roleName);
|
}
|
|
/**
|
* 验证当前用户是否属于以下任意一个角色。
|
*
|
* @param roleNames 角色列表
|
* @return 属于:true,否则false
|
*/
|
public 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 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 boolean hasPermission(String permission) {
|
return getSubject() != null && permission != null
|
&& permission.length() > 0
|
&& getSubject().isPermitted(permission);
|
}
|
|
/**
|
* 与hasPermission标签逻辑相反,当前用户没有制定权限时,验证通过。
|
*
|
* @param permission 权限名
|
* @return 拥有权限:true,否则false
|
*/
|
public boolean lacksPermission(String permission) {
|
return !hasPermission(permission);
|
}
|
|
/**
|
* 已认证通过的用户。不包含已记住的用户,这是与user标签的区别所在。与notAuthenticated搭配使用
|
*
|
* @return 通过身份验证:true,否则false
|
*/
|
public boolean authenticated() {
|
return getSubject() != null && getSubject().isAuthenticated();
|
}
|
|
/**
|
* 未认证通过用户,与authenticated标签相对应。与guest标签的区别是,该标签包含已记住用户。。
|
*
|
* @return 没有通过身份验证:true,否则false
|
*/
|
public boolean notAuthenticated() {
|
return !authenticated();
|
}
|
|
/**
|
* 认证通过或已记住的用户。与guset搭配使用。
|
*
|
* @return 用户:true,否则 false
|
*/
|
public boolean isUser() {
|
return getSubject() != null && getSubject().getPrincipal() != null;
|
}
|
|
/**
|
* 验证当前用户是否为“访客”,即未认证(包含未记住)的用户。用user搭配使用
|
*
|
* @return 访客:true,否则false
|
*/
|
public boolean isGuest() {
|
return !isUser();
|
}
|
|
/**
|
* 输出当前用户信息,通常为登录帐号信息。
|
*
|
* @return 当前用户信息
|
*/
|
public String principal() {
|
if (getSubject() != null) {
|
Object principal = getSubject().getPrincipal();
|
return principal.toString();
|
}
|
return "";
|
}
|
|
public static void main(String[] args) {
|
GroupTemplate gt = new GroupTemplate();
|
gt.registerFunctionPackage("shiro", new ShiroExt());
|
|
}
|
}
|