albertshaw %!s(int64=8) %!d(string=hai) anos
pai
achega
ea9914a159

+ 9 - 9
src/main/java/com/goafanti/admin/service/impl/AdminServiceImpl.java

@@ -22,9 +22,9 @@ import com.goafanti.core.shiro.token.TokenManager;
 @Service
 public class AdminServiceImpl extends BaseMybatisDao<AdminMapper> implements AdminService {
 	@Autowired
-	private AdminMapper adminMapper;
+	private AdminMapper		adminMapper;
 	@Autowired
-	private UserRoleMapper userRoleMapper;
+	private UserRoleMapper	userRoleMapper;
 
 	@Override
 	public List<Admin> selectAllAdmin() {
@@ -58,7 +58,7 @@ public class AdminServiceImpl extends BaseMybatisDao<AdminMapper> implements Adm
 		if (StringUtils.isNotBlank(mobile)) {
 			params.put("mobile", mobile);
 		}
-		
+
 		if (StringUtils.isNotBlank(name)) {
 			params.put("name", name);
 		}
@@ -75,8 +75,7 @@ public class AdminServiceImpl extends BaseMybatisDao<AdminMapper> implements Adm
 			pageSize = 10;
 		}
 
-		return (Pagination<Admin>) findPage("findAdminListByPage", "findAdminCount", params, pageNo,
-				pageSize);
+		return (Pagination<Admin>) findPage("findAdminListByPage", "findAdminCount", params, pageNo, pageSize);
 	}
 
 	@Override
@@ -89,14 +88,15 @@ public class AdminServiceImpl extends BaseMybatisDao<AdminMapper> implements Adm
 		Map<String, Object> params = new HashMap<>();
 		params.put("uid", ad.getId());
 		params.put("roles", roleIds);
-		
+
 		if (ad.getId() != "1") {
 			userRoleMapper.deleteByUserId(ad.getId());
 			if (!roleIds.isEmpty()) {
 				userRoleMapper.insertBatch(params);
 			}
+			TokenManager.clearUserAuthByUserId(ad.getId());
 		}
-		
+
 		return adminMapper.updateByPrimaryKeySelective(ad);
 	}
 
@@ -108,10 +108,10 @@ public class AdminServiceImpl extends BaseMybatisDao<AdminMapper> implements Adm
 	@Override
 	public AdminDetail selectAdminDetail(String id) {
 		Admin a = adminMapper.selectByPrimaryKey(id);
-		if (null == a){
+		if (null == a) {
 			return null;
 		}
-		
+
 		AdminDetail ad = new AdminDetail();
 		BeanUtils.copyProperties(a, ad);
 		ad.setRoles(adminMapper.selectRolesByPrimaryKey(id));

+ 14 - 2
src/main/java/com/goafanti/common/bo/Result.java

@@ -4,8 +4,8 @@ import java.util.ArrayList;
 import java.util.List;
 
 public class Result {
-	private Object data;
-	private List<Error> error = new ArrayList<Error>();
+	private Object		data;
+	private List<Error>	error	= new ArrayList<Error>();
 
 	public Result() {
 	}
@@ -44,4 +44,16 @@ public class Result {
 		this.error = error;
 	}
 
+	public Result error(Error e) {
+		if (e != null) {
+			this.error.add(e);
+		}
+		return this;
+	}
+
+	public Result data(Object o) {
+		this.data = o;
+		return this;
+	}
+
 }

+ 3 - 6
src/main/java/com/goafanti/common/constant/ShiroConstants.java

@@ -1,13 +1,10 @@
 package com.goafanti.common.constant;
 
 public class ShiroConstants {
-	public static final String LOGIN_URL = "/login";
-	public static final String UNAUTHORIZED_URL = "/login";
+	public static final String SESSION_STATUS = "goafanti-online-status";
 
-	public static final String SESSION_STATUS = "jfgj-online-status";
-
-	public static final String REDIS_SHIRO_SESSION = "szrobot-jfgj-session:";
-	public static final String REDIS_SHIRO_ALL = "*szrobot-jfgj-session:*";
+	public static final String REDIS_SHIRO_SESSION = "goafanti-session:";
+	public static final String REDIS_SHIRO_ALL = "*goafanti-session:*";
 
 	// 0:禁止登录
 	public static final Integer USER_DISABLE = new Integer(0);

+ 2 - 0
src/main/java/com/goafanti/common/model/AftUser.java

@@ -10,4 +10,6 @@ public interface AftUser {
 	 Date getCreateTime();
 	 
 	 String getAid();
+	 
+	 String getMobile();
 }

+ 47 - 0
src/main/java/com/goafanti/core/shiro/filter/AdminFilter.java

@@ -0,0 +1,47 @@
+package com.goafanti.core.shiro.filter;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.shiro.web.filter.AccessControlFilter;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import com.goafanti.common.bo.Error;
+import com.goafanti.common.bo.Result;
+import com.goafanti.common.model.Admin;
+import com.goafanti.common.model.AftUser;
+import com.goafanti.common.utils.LoggerUtils;
+import com.goafanti.core.shiro.token.TokenManager;
+
+public class AdminFilter extends AccessControlFilter {
+	final static Class<AdminFilter>	CLASS	= AdminFilter.class;
+
+	@Autowired
+	private ShiroFilterUtils		shiroFilterUtils;
+
+	@Override
+	protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)
+			throws Exception {
+
+		AftUser token = TokenManager.getToken();
+		if (token instanceof Admin) {
+			return Boolean.TRUE;
+		}
+		return Boolean.FALSE;
+	}
+
+	@Override
+	protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
+		// 保存Request和Response 到登录后的链接
+		if (!shiroFilterUtils.isAjax((HttpServletRequest) request)) {
+			saveRequestAndRedirectToLogin(request, response);
+		} else {
+			LoggerUtils.debug(getClass(), "当前用户没有登录,并且是Ajax请求!");
+			shiroFilterUtils.out((HttpServletResponse) response, new Result().error(new Error("", "403", "当前用户没有登录!")));
+		}
+		return Boolean.FALSE;
+	}
+
+}

+ 4 - 32
src/main/java/com/goafanti/core/shiro/filter/LoginFilter.java

@@ -5,15 +5,11 @@ import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.web.filter.AccessControlFilter;
 import org.springframework.beans.factory.annotation.Autowired;
 
 import com.goafanti.common.bo.Error;
 import com.goafanti.common.bo.Result;
-import com.goafanti.common.model.Admin;
-import com.goafanti.common.model.AftUser;
-import com.goafanti.common.model.User;
 import com.goafanti.common.utils.LoggerUtils;
 import com.goafanti.core.shiro.token.TokenManager;
 
@@ -27,36 +23,9 @@ public class LoginFilter extends AccessControlFilter {
 	protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)
 			throws Exception {
 
-		AftUser token = TokenManager.getToken();
-
-		HttpServletRequest httpRequest = ((HttpServletRequest) request);
-
-		String uri = httpRequest.getRequestURI();// 获取URI
-		if (uri == null) {
-			uri = "";
-		}
-		String basePath = httpRequest.getContextPath();// 获取basePath
-		if (StringUtils.isNotBlank(basePath) && uri.startsWith(basePath)) {
-			uri = uri.replaceAll("^\\" + basePath + "\\/+", "").replaceAll("\\.html$", "");
-		} else {
-			uri = uri.replaceAll("^\\/", "");
-		}
-		
-
-		if (token != null && uri.startsWith("api/admin/") && token instanceof Admin) {
-			return Boolean.TRUE;
-		}
-
-		if (token != null && uri.startsWith("api/user/") && token instanceof User) {
+		if (TokenManager.isLogin()) {
 			return Boolean.TRUE;
 		}
-
-		if (shiroFilterUtils.isAjax((HttpServletRequest) request)) {// ajax请求
-			LoggerUtils.debug(getClass(), "当前用户没有登录,并且是Ajax请求!");
-			Result res = new Result();
-			res.getError().add(new Error("", "403", "当前用户没有登录!"));// 当前用户没有登录!
-			shiroFilterUtils.out((HttpServletResponse) response, res);
-		}
 		return Boolean.FALSE;
 	}
 
@@ -65,6 +34,9 @@ public class LoginFilter extends AccessControlFilter {
 		// 保存Request和Response 到登录后的链接
 		if (!shiroFilterUtils.isAjax((HttpServletRequest) request)) {
 			saveRequestAndRedirectToLogin(request, response);
+		} else {
+			LoggerUtils.debug(getClass(), "当前用户没有登录,并且是Ajax请求!");
+			shiroFilterUtils.out((HttpServletResponse) response, new Result().error(new Error("", "403", "当前用户没有登录!")));
 		}
 		return Boolean.FALSE;
 	}

+ 9 - 26
src/main/java/com/goafanti/core/shiro/filter/PermissionFilter.java

@@ -13,7 +13,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 
 import com.goafanti.common.bo.Error;
 import com.goafanti.common.bo.Result;
-import com.goafanti.common.constant.ShiroConstants;
+import com.goafanti.common.constant.AFTConstants;
 import com.goafanti.common.utils.LoggerUtils;
 
 public class PermissionFilter extends AccessControlFilter {
@@ -27,48 +27,31 @@ public class PermissionFilter extends AccessControlFilter {
 
 		// 先判断带参数的权限判断
 		Subject subject = getSubject(request, response);
-		if (null != mappedValue) {
-			String[] arra = (String[]) mappedValue;
-			for (String permission : arra) {
-				if (subject.isPermitted(permission)) {
-					return Boolean.TRUE;
-				}
-			}
-		}
 		HttpServletRequest httpRequest = ((HttpServletRequest) request);
-
 		String uri = httpRequest.getRequestURI();// 获取URI
 		String basePath = httpRequest.getContextPath();// 获取basePath
-		if (StringUtils.hasText(uri) && StringUtils.hasText(basePath) &&uri.startsWith(basePath)) {
+		if (StringUtils.hasText(uri) && StringUtils.hasText(basePath) && uri.startsWith(basePath)) {
 			uri = uri.replaceAll("^\\" + basePath + "\\/+", "").replaceAll("\\.html$", "");
 		} else {
 			uri = uri.replaceAll("^\\/", "");
 		}
-		if (subject.isPermitted(uri) || subject.hasRole("999999")) {
+		if (subject.isPermitted(uri) || subject.hasRole(AFTConstants.SUPERADMIN)) {
 			return Boolean.TRUE;
 		}
-		if (shiroFilterUtils.isAjax(httpRequest)) {
-			LoggerUtils.debug(getClass(), "当前用户权限不够,并且是Ajax请求!");
-			Result res = new Result();
-			res.getError().add(new Error("", "403", "当前用户权限不够!"));// 当前用户没有登录!
-			shiroFilterUtils.out((HttpServletResponse) response, res);
-		}
 		return Boolean.FALSE;
 	}
 
 	@Override
 	protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
-
 		Subject subject = getSubject(request, response);
-		if (null == subject.getPrincipal()) {// 表示没有登录,重定向到登录页面
+		if (shiroFilterUtils.isAjax((HttpServletRequest) request)) {
+			LoggerUtils.debug(getClass(), "当前用户权限不够,并且是Ajax请求!");
+			shiroFilterUtils.out((HttpServletResponse) response, new Result().error(new Error("", "403", "当前用户权限不够!")));
+		} else if (null == subject.getPrincipal()) {
 			saveRequest(request);
-			WebUtils.issueRedirect(request, response, ShiroConstants.LOGIN_URL);
+			WebUtils.issueRedirect(request, response, getLoginUrl());
 		} else {
-			if (StringUtils.hasText(ShiroConstants.UNAUTHORIZED_URL)) {// 如果有未授权页面跳转过去
-				WebUtils.issueRedirect(request, response, ShiroConstants.UNAUTHORIZED_URL);
-			} else {// 否则返回401未授权状态码
-				WebUtils.toHttp(response).sendError(HttpServletResponse.SC_UNAUTHORIZED);
-			}
+			WebUtils.toHttp(response).sendError(HttpServletResponse.SC_UNAUTHORIZED);
 		}
 		return Boolean.FALSE;
 	}

+ 0 - 47
src/main/java/com/goafanti/core/shiro/filter/RoleFilter.java

@@ -1,47 +0,0 @@
-package com.goafanti.core.shiro.filter;
-
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.shiro.subject.Subject;
-import org.apache.shiro.util.StringUtils;
-import org.apache.shiro.web.filter.AccessControlFilter;
-import org.apache.shiro.web.util.WebUtils;
-
-import com.goafanti.common.constant.ShiroConstants;
-
-public class RoleFilter extends AccessControlFilter {
-
-	@Override
-	protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)
-			throws Exception {
-		String[] arra = (String[]) mappedValue;
-
-		Subject subject = getSubject(request, response);
-		for (String role : arra) {
-			if (subject.hasRole("role:" + role)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	@Override
-	protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
-
-		Subject subject = getSubject(request, response);
-		if (subject.getPrincipal() == null) {// 表示没有登录,重定向到登录页面
-			saveRequest(request);
-			WebUtils.issueRedirect(request, response, ShiroConstants.LOGIN_URL);
-		} else {
-			if (StringUtils.hasText(ShiroConstants.UNAUTHORIZED_URL)) {// 如果有未授权页面跳转过去
-				WebUtils.issueRedirect(request, response, ShiroConstants.UNAUTHORIZED_URL);
-			} else {// 否则返回401未授权状态码
-				WebUtils.toHttp(response).sendError(HttpServletResponse.SC_UNAUTHORIZED);
-			}
-		}
-		return false;
-	}
-
-}

+ 0 - 65
src/main/java/com/goafanti/core/shiro/filter/SimpleAuthFilter.java

@@ -1,65 +0,0 @@
-package com.goafanti.core.shiro.filter;
-
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.shiro.session.Session;
-import org.apache.shiro.subject.Subject;
-import org.apache.shiro.web.filter.AccessControlFilter;
-import org.apache.shiro.web.util.WebUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import com.goafanti.common.bo.Error;
-import com.goafanti.common.bo.Result;
-import com.goafanti.common.constant.ShiroConstants;
-import com.goafanti.common.utils.LoggerUtils;
-import com.goafanti.core.shiro.session.SessionStatus;
-
-public class SimpleAuthFilter extends AccessControlFilter {
-
-	@Autowired
-	private ShiroFilterUtils shiroFilterUtils;
-	@Override
-	protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)
-			throws Exception {
-
-		HttpServletRequest httpRequest = ((HttpServletRequest) request);
-		String url = httpRequest.getRequestURI();
-		String basePath = httpRequest.getContextPath();// 获取basePath
-		if (null != url && url.startsWith(basePath)) {
-			url = url.replace(basePath, "");
-		}
-		if (url.startsWith("/open/")) {
-			return Boolean.TRUE;
-		}
-		Subject subject = getSubject(request, response);
-		Session session = subject.getSession();
-		SessionStatus sessionStatus = (SessionStatus) session.getAttribute(ShiroConstants.SESSION_STATUS);
-		if (null != sessionStatus && !sessionStatus.isOnlineStatus()) {
-			// 判断是不是Ajax请求
-			if (shiroFilterUtils.isAjax((HttpServletRequest) request)) {
-				LoggerUtils.debug(getClass(), "当前用户已经被踢出,并且是Ajax请求!");
-				Result res = new Result();
-				res.getError().add(new Error("", "403", "您的登录已失效,请重新登录!"));
-				shiroFilterUtils.out((HttpServletResponse) response, res);
-			}
-			return Boolean.FALSE;
-		}
-		return Boolean.TRUE;
-	}
-
-	@Override
-	protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
-
-		// 先退出
-		Subject subject = getSubject(request, response);
-		subject.logout();
-		WebUtils.saveRequest(request);
-		// 再重定向
-		WebUtils.issueRedirect(request, response, ShiroConstants.LOGIN_URL);
-		return false;
-	}
-
-}

+ 100 - 98
src/main/java/com/goafanti/core/shiro/session/CustomSessionManager.java

@@ -14,7 +14,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 
 import com.goafanti.common.constant.ShiroConstants;
 import com.goafanti.common.model.AftUser;
-import com.goafanti.common.model.User;
 import com.goafanti.common.utils.ArrayUtils;
 import com.goafanti.common.utils.LoggerUtils;
 import com.goafanti.core.shiro.CustomShiroSessionDAO;
@@ -25,29 +24,29 @@ public class CustomSessionManager {
 	 * session status
 	 */
 	@Autowired
-	ShiroSessionRepository shiroSessionRepository;
+	ShiroSessionRepository	shiroSessionRepository;
 
 	@Autowired
-	CustomShiroSessionDAO customShiroSessionDAO;
+	CustomShiroSessionDAO	customShiroSessionDAO;
 
-//	/**
-//	 * 获取所有的有效Session用户
-//	 * 
-//	 * @return
-//	 */
-//	public List<UserOnlineBo> getAllUser() {
-//		// 获取所有session
-//		Collection<Session> sessions = customShiroSessionDAO.getActiveSessions();
-//		List<UserOnlineBo> list = new ArrayList<UserOnlineBo>();
-//
-//		for (Session session : sessions) {
-//			UserOnlineBo bo = getSessionBo(session);
-//			if (null != bo) {
-//				list.add(bo);
-//			}
-//		}
-//		return list;
-//	}
+	// /**
+	// * 获取所有的有效Session用户
+	// *
+	// * @return
+	// */
+	// public List<UserOnlineBo> getAllUser() {
+	// // 获取所有session
+	// Collection<Session> sessions = customShiroSessionDAO.getActiveSessions();
+	// List<UserOnlineBo> list = new ArrayList<UserOnlineBo>();
+	//
+	// for (Session session : sessions) {
+	// UserOnlineBo bo = getSessionBo(session);
+	// if (null != bo) {
+	// list.add(bo);
+	// }
+	// }
+	// return list;
+	// }
 
 	/**
 	 * 根据ID查询 SimplePrincipalCollection
@@ -72,7 +71,7 @@ public class CustomSessionManager {
 				SimplePrincipalCollection spc = (SimplePrincipalCollection) obj;
 				// 判断用户,匹配用户ID。
 				obj = spc.getPrimaryPrincipal();
-				if (null != obj && obj instanceof User) {
+				if (null != obj && obj instanceof AftUser) {
 					AftUser user = (AftUser) obj;
 					// 比较用户ID,符合即加入集合
 					if (null != user && idset.contains(user.getId())) {
@@ -84,58 +83,60 @@ public class CustomSessionManager {
 		return list;
 	}
 
-//	/**
-//	 * 获取单个Session
-//	 * 
-//	 * @param sessionId
-//	 * @return
-//	 */
-//	public UserOnlineBo getSession(String sessionId) {
-//		Session session = shiroSessionRepository.getSession(sessionId);
-//		UserOnlineBo bo = getSessionBo(session);
-//		return bo;
-//	}
+	// /**
+	// * 获取单个Session
+	// *
+	// * @param sessionId
+	// * @return
+	// */
+	// public UserOnlineBo getSession(String sessionId) {
+	// Session session = shiroSessionRepository.getSession(sessionId);
+	// UserOnlineBo bo = getSessionBo(session);
+	// return bo;
+	// }
 
-//	private UserOnlineBo getSessionBo(Session session) {
-//		// 获取session登录信息。
-//		Object obj = session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY);
-//		if (null == obj) {
-//			return null;
-//		}
-//		// 确保是 SimplePrincipalCollection对象。
-//		if (obj instanceof SimplePrincipalCollection) {
-//			SimplePrincipalCollection spc = (SimplePrincipalCollection) obj;
-//			/**
-//			 * 获取用户登录的,@link UserRealm.doGetAuthenticationInfo(...)方法中 return
-//			 * new SimpleAuthenticationInfo(user,user.getPwd(),
-//			 * getName());的user 对象。
-//			 */
-//			obj = spc.getPrimaryPrincipal();
-//			if (null != obj && obj instanceof User) {
-//				// 存储session + user 综合信息
-//				UserOnlineBo userBo = new UserOnlineBo((User) obj);
-//				// 最后一次和系统交互的时间
-//				userBo.setLastAccess(session.getLastAccessTime());
-//				// 主机的ip地址
-//				userBo.setHost(session.getHost());
-//				// session ID
-//				userBo.setSessionId(session.getId().toString());
-//				// 回话到期 ttl(ms)
-//				userBo.setTimeout(session.getTimeout());
-//				// session创建时间
-//				userBo.setStartTime(session.getStartTimestamp());
-//				// 是否踢出
-//				SessionStatus sessionStatus = (SessionStatus) session.getAttribute(ShiroConstants.SESSION_STATUS);
-//				boolean status = Boolean.TRUE;
-//				if (null != sessionStatus) {
-//					status = sessionStatus.getOnlineStatus();
-//				}
-//				userBo.setSessionStatus(status);
-//				return userBo;
-//			}
-//		}
-//		return null;
-//	}
+	// private UserOnlineBo getSessionBo(Session session) {
+	// // 获取session登录信息。
+	// Object obj =
+	// session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY);
+	// if (null == obj) {
+	// return null;
+	// }
+	// // 确保是 SimplePrincipalCollection对象。
+	// if (obj instanceof SimplePrincipalCollection) {
+	// SimplePrincipalCollection spc = (SimplePrincipalCollection) obj;
+	// /**
+	// * 获取用户登录的,@link UserRealm.doGetAuthenticationInfo(...)方法中 return
+	// * new SimpleAuthenticationInfo(user,user.getPwd(),
+	// * getName());的user 对象。
+	// */
+	// obj = spc.getPrimaryPrincipal();
+	// if (null != obj && obj instanceof User) {
+	// // 存储session + user 综合信息
+	// UserOnlineBo userBo = new UserOnlineBo((User) obj);
+	// // 最后一次和系统交互的时间
+	// userBo.setLastAccess(session.getLastAccessTime());
+	// // 主机的ip地址
+	// userBo.setHost(session.getHost());
+	// // session ID
+	// userBo.setSessionId(session.getId().toString());
+	// // 回话到期 ttl(ms)
+	// userBo.setTimeout(session.getTimeout());
+	// // session创建时间
+	// userBo.setStartTime(session.getStartTimestamp());
+	// // 是否踢出
+	// SessionStatus sessionStatus = (SessionStatus)
+	// session.getAttribute(ShiroConstants.SESSION_STATUS);
+	// boolean status = Boolean.TRUE;
+	// if (null != sessionStatus) {
+	// status = sessionStatus.getOnlineStatus();
+	// }
+	// userBo.setSessionStatus(status);
+	// return userBo;
+	// }
+	// }
+	// return null;
+	// }
 
 	/**
 	 * 改变Session状态
@@ -173,31 +174,32 @@ public class CustomSessionManager {
 		return map;
 	}
 
-//	/**
-//	 * 查询要禁用的用户是否在线。
-//	 * 
-//	 * @param id
-//	 *            用户ID
-//	 * @param status
-//	 *            用户状态
-//	 */
-//	public void forbidUserById(Long id, Integer status) {
-//		// 获取所有在线用户
-//		for (UserOnlineBo bo : getAllUser()) {
-//			Long userId = bo.getId();
-//			// 匹配用户ID
-//			if (userId.equals(id)) {
-//				// 获取用户Session
-//				Session session = shiroSessionRepository.getSession(bo.getSessionId());
-//				// 标记用户Session
-//				SessionStatus sessionStatus = (SessionStatus) session.getAttribute(ShiroConstants.SESSION_STATUS);
-//				// 是否踢出 true:有效,false:踢出。
-//				sessionStatus.setOnlineStatus(status == 1);
-//				// 更新Session
-//				customShiroSessionDAO.update(session);
-//			}
-//		}
-//	}
+	// /**
+	// * 查询要禁用的用户是否在线。
+	// *
+	// * @param id
+	// * 用户ID
+	// * @param status
+	// * 用户状态
+	// */
+	// public void forbidUserById(Long id, Integer status) {
+	// // 获取所有在线用户
+	// for (UserOnlineBo bo : getAllUser()) {
+	// Long userId = bo.getId();
+	// // 匹配用户ID
+	// if (userId.equals(id)) {
+	// // 获取用户Session
+	// Session session = shiroSessionRepository.getSession(bo.getSessionId());
+	// // 标记用户Session
+	// SessionStatus sessionStatus = (SessionStatus)
+	// session.getAttribute(ShiroConstants.SESSION_STATUS);
+	// // 是否踢出 true:有效,false:踢出。
+	// sessionStatus.setOnlineStatus(status == 1);
+	// // 更新Session
+	// customShiroSessionDAO.update(session);
+	// }
+	// }
+	// }
 
 	public void setShiroSessionRepository(ShiroSessionRepository shiroSessionRepository) {
 		this.shiroSessionRepository = shiroSessionRepository;

+ 12 - 8
src/main/java/com/goafanti/core/shiro/token/ShiroToken.java

@@ -13,16 +13,18 @@ public class ShiroToken extends UsernamePasswordToken implements Serializable {
 		this.pwd = pwd;
 		this.type = type;
 	}
-	
+
 	public ShiroToken(String username, String pwd) {
 		super(username, pwd);
 		this.pwd = pwd;
 	}
 
 	/** 登录密码[字符串类型] 因为父类是char[] ] **/
-	private String pwd;
-	
-	private Integer type;
+	private String	pwd;
+
+	private Integer	type;
+
+	private String	id;
 
 	public String getPwd() {
 		return pwd;
@@ -40,10 +42,12 @@ public class ShiroToken extends UsernamePasswordToken implements Serializable {
 		this.type = type;
 	}
 
-	public static long getSerialversionuid() {
-		return serialVersionUID;
+	@Override
+	public Object getPrincipal() {
+		return id;
 	}
-	
-	
 
+	public void setId(String id) {
+		this.id = id;
+	}
 }

+ 2 - 24
src/main/java/com/goafanti/core/shiro/token/TokenManager.java

@@ -1,10 +1,7 @@
 package com.goafanti.core.shiro.token;
 
-import java.util.List;
-
 import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.session.Session;
-import org.apache.shiro.subject.SimplePrincipalCollection;
 
 import com.goafanti.common.model.Admin;
 import com.goafanti.common.model.AftUser;
@@ -37,7 +34,7 @@ public class TokenManager {
 	public static boolean hasRole(String role) {
 		return SecurityUtils.getSubject().hasRole(role);
 	}
-	
+
 	/**
 	 * 获取当前登录的用户User对象Permission
 	 * 
@@ -203,26 +200,7 @@ public class TokenManager {
 	 *            用户ID
 	 */
 	public static void clearUserAuthByUserId(String... userIds) {
-
-		if (null == userIds || userIds.length == 0)
-			return;
-		List<SimplePrincipalCollection> result = customSessionManager.getSimplePrincipalCollectionByUserId(userIds);
-
-		for (SimplePrincipalCollection simplePrincipalCollection : result) {
-			realm.clearCachedAuthorizationInfo(simplePrincipalCollection);
-		}
-	}
-
-	/**
-	 * 方法重载
-	 * 
-	 * @param userIds
-	 */
-	public static void clearUserAuthByUserId(List<Long> userIds) {
-		if (null == userIds || userIds.size() == 0) {
-			return;
-		}
-		clearUserAuthByUserId(userIds.toArray(new String[0]));
+		realm.clearCachedAuthorizationInfo(userIds);
 	}
 
 	// public static void forbidUser(Long userId) {

+ 19 - 20
src/main/java/com/goafanti/core/shiro/token/UserRealm.java

@@ -55,6 +55,7 @@ public class UserRealm extends AuthorizingRealm {
 			if (null == admin) {
 				throw new UnknownAccountException();
 			}
+			token.setId(admin.getId());
 			AftUser aftUser = admin;
 			return new SimpleAuthenticationInfo(aftUser, aftUser.getPassword(), passwordUtil.getAftSalt(aftUser),
 					getName());
@@ -64,25 +65,11 @@ public class UserRealm extends AuthorizingRealm {
 
 				throw new UnknownAccountException();
 			}
+			token.setId(user.getId());
 			AftUser aftUser = user;
 			return new SimpleAuthenticationInfo(aftUser, aftUser.getPassword(), passwordUtil.getAftSalt(aftUser),
 					getName());
 		}
-		// User user = userService.findUserByEmail(token.getUsername());
-		// if (null == user) {
-		// throw new UnknownAccountException();
-		// } else if (ShiroConstants.USER_DISABLE.equals(user.getStatus())) {
-		// /**
-		// * 如果用户的status为禁用。那么就抛出<code>DisabledAccountException</code>
-		// */
-		// throw new DisabledAccountException("帐号已经禁止登录!");
-		// } else {
-		// user.setLastLoginTime(new Date());
-		// userService.updateByPrimaryKeySelective(user);
-		// }
-		// return new SimpleAuthenticationInfo(user, user.getPwd(),
-		// passwordUtil.getSalt(user), getName());
-		// return null;
 	}
 
 	/**
@@ -105,16 +92,28 @@ public class UserRealm extends AuthorizingRealm {
 	 * 清空当前用户权限信息
 	 */
 	public void clearCachedAuthorizationInfo() {
-		PrincipalCollection principalCollection = SecurityUtils.getSubject().getPrincipals();
-		SimplePrincipalCollection principals = new SimplePrincipalCollection(principalCollection, getName());
+		AftUser principal = (AftUser) SecurityUtils.getSubject().getPrincipal();
+		SimplePrincipalCollection principals = new SimplePrincipalCollection(principal.getId(), getName());
 		super.clearCachedAuthorizationInfo(principals);
 	}
 
 	/**
 	 * 指定principalCollection 清除
 	 */
-	public void clearCachedAuthorizationInfo(PrincipalCollection principalCollection) {
-		SimplePrincipalCollection principals = new SimplePrincipalCollection(principalCollection, getName());
-		super.clearCachedAuthorizationInfo(principals);
+	public void clearCachedAuthorizationInfo(String... userIds) {
+		if (null == userIds || userIds.length == 0)
+			return;
+		for (String uid : userIds) {
+			super.clearCachedAuthorizationInfo(new SimplePrincipalCollection(uid, getName()));
+		}
+	}
+
+	@Override
+	protected Object getAuthorizationCacheKey(PrincipalCollection principals) {
+		Object principal = principals.getPrimaryPrincipal();
+		if (principal instanceof AftUser) {
+			return ((AftUser) principal).getId();
+		}
+		return principal;
 	}
 }

+ 3 - 7
src/main/java/com/goafanti/permission/service/impl/RoleServiceImpl.java

@@ -73,13 +73,7 @@ public class RoleServiceImpl extends BaseMybatisDao<RoleMapper> implements RoleS
 	public int deleteByPrimaryKeys(List<String> records) {
 		rolePermissionMapper.deleteByRoleId(records);
 		userRoleMapper.deleteByRoleId(records);
-		List<String> list = userRoleMapper.findUserIdByRoleIds(records);
-		String[] arr = new String[list.size()];
-		for (int i = 0; i<arr.length; i++){
-			arr[i] = list.get(i);
-		}
-		//TokenManager.clearUserAuthByUserId((String[]) userRoleMapper.findUserIdByRoleIds(records).toArray());
-		TokenManager.clearUserAuthByUserId(arr);
+		TokenManager.clearUserAuthByUserId((String[]) userRoleMapper.findUserIdByRoleIds(records).toArray());
 		return roleMapper.deleteByPrimaryKeys(records);
 	}
 
@@ -124,6 +118,8 @@ public class RoleServiceImpl extends BaseMybatisDao<RoleMapper> implements RoleS
 			if (!rps.isEmpty()) {
 				rolePermissionMapper.insertBatch(rps);
 			}
+			List<String> ids = userRoleMapper.findUserIdByRoleId(record.getId());
+			TokenManager.clearUserAuthByUserId(ids.toArray(new String[ids.size()]));
 		}
 		record.getId();
 		return roleMapper.insert(record);

+ 7 - 2
src/main/resources/shiro_base_auth.ini

@@ -1,11 +1,16 @@
 [base_auth]
 /login=anon
+/user/login=anon
+/admin/login=anon
 /signin=anon
 /managesignin=anon
 /register=anon
 /open/**=anon
 /favicon.ico=anon
 /static/**=anon
-/api/admin/**=login,permission
+/api/admin/**=admin,permission
 /api/user/**=login
-/**=anon
+/admin/**=admin,permission
+/role/**=admin,permission
+/permission/**=admin,permission
+/**=login

+ 16 - 12
src/main/resources/spring/spring-shiro.xml

@@ -128,25 +128,29 @@
 	
 	<!-- -->
     <bean id="shiroManager" class="com.goafanti.core.shiro.service.impl.ShiroManagerImpl"/>
-    <bean id="login" class="com.goafanti.core.shiro.filter.LoginFilter"/>
-    <bean id="role" class="com.goafanti.core.shiro.filter.RoleFilter"/>
-    <bean id="permission" class="com.goafanti.core.shiro.filter.PermissionFilter"/>
-    <bean id="simple" class="com.goafanti.core.shiro.filter.SimpleAuthFilter"/>
 	
 	<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
 		<property name="securityManager" ref="securityManager" />
-		<property name="loginUrl" value="/login" />
-		<property name="successUrl" value="/main" />
-		<property name="unauthorizedUrl" value="/login" />
+		<property name="loginUrl" value="/user/login" />
+		<property name="successUrl" value="/" />
+		<property name="unauthorizedUrl" value="/user/login" />
 	
-		<!-- -->
        <property name="filterChainDefinitions" value="#{shiroManager.loadFilterChainDefinitions()}"/>   
        <property name="filters">
            <util:map>
-              <entry key="login" value-ref="login"></entry>
-              <entry key="role" value-ref="role"></entry>
-              <entry key="simple" value-ref="simple"></entry>
-              <entry key="permission" value-ref="permission"></entry>
+              <entry key="login">
+              	<bean id="login" class="com.goafanti.core.shiro.filter.LoginFilter"/>
+              </entry>
+              <entry key="permission">
+              	<bean id="permission" class="com.goafanti.core.shiro.filter.PermissionFilter">
+              		<property name="loginUrl" value="/admin/login" />
+              	</bean>
+              </entry>
+              <entry key="admin">
+              	<bean id="admin" class="com.goafanti.core.shiro.filter.AdminFilter">
+              		<property name="loginUrl" value="/admin/login" />
+              	</bean>
+              </entry>
            </util:map>
        </property>
 	</bean>