|
|
@@ -25,7 +25,6 @@ import com.uas.sso.SSOConfig;
|
|
|
import com.uas.sso.SSOHelper;
|
|
|
import com.uas.sso.SSOToken;
|
|
|
import com.uas.sso.entity.UserAccount;
|
|
|
-import com.uas.sso.web.spring.AbstractSSOInterceptor;
|
|
|
import org.apache.commons.collections.CollectionUtils;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
@@ -39,6 +38,7 @@ import org.springframework.mobile.device.site.SitePreference;
|
|
|
import org.springframework.security.access.AccessDeniedException;
|
|
|
import org.springframework.security.access.ConfigAttribute;
|
|
|
import org.springframework.security.access.SecurityConfig;
|
|
|
+import org.springframework.security.access.method.P;
|
|
|
import org.springframework.security.core.GrantedAuthority;
|
|
|
import org.springframework.security.core.authority.SimpleGrantedAuthority;
|
|
|
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
|
|
@@ -109,50 +109,14 @@ public class SSOInterceptor extends B2bAbstractSSOInterceptor {
|
|
|
static final String UU_REGEXP = "^\\d{4,}$";
|
|
|
|
|
|
|
|
|
+ private final static String PARAM_ACCESS_TOKEN = "access_token";
|
|
|
+ private final static String PARAM_CLIENT_TYPE = "client_type";
|
|
|
+ private final static String CLIENT_TYPE_MANAGE = "manage";
|
|
|
+
|
|
|
+
|
|
|
private HashMap<String, Collection<ConfigAttribute>> resourceMap;
|
|
|
private HashMap<Long, Collection<GrantedAuthority>> authorities;
|
|
|
|
|
|
- /**
|
|
|
- * 从token获取用户信息
|
|
|
- *
|
|
|
- * @param token token
|
|
|
- * @return User
|
|
|
- */
|
|
|
- private User getUserByToken(SSOToken token) {
|
|
|
- // 授权登录用户
|
|
|
- User authorizedUser = null;
|
|
|
- if (null != token && token.getData() != null) {
|
|
|
- UserAccount tokenUser = FlexJsonUtils.fromJson(token.getData(), UserAccount.class);
|
|
|
- if (!StringUtils.isEmpty(tokenUser.getUserUU())) {
|
|
|
- // dialectUID表示client系统自己的唯一标识,比如user_uu,手机号没设置的情况下使用
|
|
|
- authorizedUser = userService.findUserByUserUU(tokenUser.getUserUU());
|
|
|
- } else if (!StringUtils.isEmpty(tokenUser.getMobile())) {
|
|
|
- // UID表示所有系统公认的唯一标识,这里统一使用手机号
|
|
|
- authorizedUser = userService.findUserByUserTel(tokenUser.getMobile());
|
|
|
- } else if (!StringUtils.isEmpty(tokenUser.getEmail())) {
|
|
|
- // UID表示所有系统公认的唯一标识,这里统一使用手机号
|
|
|
- authorizedUser = userService.findUserByUserEmail(tokenUser.getEmail());
|
|
|
- } else {
|
|
|
- logger.error(String.format("invalid user %s, please set uid or dialectUID", tokenUser.getVipName()));
|
|
|
- }
|
|
|
- if (authorizedUser != null && authorizedUser.getEnterprises() != null) {
|
|
|
- // 企业资料在client系统自己的唯一标识,比如en_uu
|
|
|
- if (tokenUser.getSpaceUU() != null) {
|
|
|
- authorizedUser.setCurrentEnterprise(tokenUser.getSpaceUU());
|
|
|
- } else if (!StringUtils.isEmpty(tokenUser.getBusinessCode())) {
|
|
|
- for (Enterprise enterprise : authorizedUser.getEnterprises()) {
|
|
|
- // 企业资料在所有系统公认的唯一标识,这里使用商业登记证号
|
|
|
- if (tokenUser.getBusinessCode().equals(enterprise.getEnBussinessCode())) {
|
|
|
- authorizedUser.setEnterprise(enterprise);
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- return authorizedUser;
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 验证失败
|
|
|
*
|
|
|
@@ -162,93 +126,53 @@ public class SSOInterceptor extends B2bAbstractSSOInterceptor {
|
|
|
*/
|
|
|
@Override
|
|
|
protected boolean onAuthenticateFailed(HttpServletRequest request, HttpServletResponse response) {
|
|
|
- SystemSession.clear();
|
|
|
- User user = (User) request.getSession().getAttribute("user");
|
|
|
- if (user == null) {
|
|
|
- user = getUserByAccessToken(request);
|
|
|
- if (user != null) {
|
|
|
- user.setIp(AgentUtils.getIp(request));
|
|
|
- request.getSession().setAttribute("user", user);
|
|
|
- setGrantedAuthorities(user);
|
|
|
- } else {
|
|
|
- user = autoLogin(request);
|
|
|
- }
|
|
|
- }
|
|
|
+ // 验证是否来自管理后台虚拟用户
|
|
|
+ User user = getUserByAccessToken(request);
|
|
|
if (user != null) {
|
|
|
- // 个人用户,跳转至提示页面
|
|
|
- if (checkIsPersonal(user)) {
|
|
|
- try {
|
|
|
- response.sendRedirect("/error_personal");
|
|
|
- } catch (IOException e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- return false;
|
|
|
- }
|
|
|
- // 登录之前判断在当前企业的角色信息
|
|
|
- if (null != user.getEnterprise() && user.getEnterprise().getEnAdminuu().equals(user.getUserUU())) {
|
|
|
- Enterprise enterprise = user.getEnterprise();
|
|
|
- user = checkRoleAndReturnUserInfo(user, enterprise);
|
|
|
- user.setCurrentEnterprise(enterprise.getUu());
|
|
|
- }
|
|
|
- SystemSession.setUser(user);
|
|
|
- try {
|
|
|
- accessDecision(request, user);
|
|
|
- } catch (IOException e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- setResponseAuthorized(response, user, true);
|
|
|
- return true;
|
|
|
- } else {
|
|
|
- if (SecurityConstant.AUTHENTICATION_URL.equals(request.getRequestURI())) {
|
|
|
- return true;
|
|
|
- }
|
|
|
- AntPathRequestMatcher matcher = new AntPathRequestMatcher("/account/enterprise/info/**");
|
|
|
- if (matcher.matches(request)) {
|
|
|
- return true;
|
|
|
- }
|
|
|
- setResponseAuthorized(response, user, false);
|
|
|
- if (!isRedirectAble(request)) {
|
|
|
- try {
|
|
|
- printJson(response, new ModelMap("loginUrl", getLoginPage(request, response)));
|
|
|
- } catch (IOException e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- }
|
|
|
- return false;
|
|
|
+ // 管理后台虚拟用户都是管理员角色,不需要验证权限
|
|
|
+ parseAuthenticationSuccess(request, response, user);
|
|
|
+ return true;
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- /**
|
|
|
- * 校验角色信息,返回用户信息
|
|
|
- *
|
|
|
- * @param user 用户
|
|
|
- * @param enterprise 当前企业
|
|
|
- * @return User
|
|
|
- */
|
|
|
- private User checkRoleAndReturnUserInfo(User user, Enterprise enterprise) {
|
|
|
- // 设置为本企业管理员
|
|
|
- List<Role> adminList = roleDao.findByEnUUAndDesc(enterprise.getUu(), "管理员");
|
|
|
- Set<Role> existRoles = user.getRoles();
|
|
|
- if (!org.springframework.util.CollectionUtils.isEmpty(adminList)) {
|
|
|
- final boolean[] exist = {false};
|
|
|
- existRoles.forEach(role -> {
|
|
|
- if (Objects.equals(role.getId(), adminList.get(0).getId())) {
|
|
|
- exist[0] = true;
|
|
|
- }
|
|
|
- });
|
|
|
- if (!exist[0]) {
|
|
|
- user.getRoles().add(adminList.get(0));
|
|
|
- try {
|
|
|
- user = userDao.save(user);
|
|
|
- } catch (Exception e) {
|
|
|
- // 这里存储异常情况通常是角色存在,因为上面已经添加角色信息,这里直接返回user,不做处理
|
|
|
- logger.info("存储异常" + e.getMessage());
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- return user;
|
|
|
+ return parseAuthenticateFailed(request, response);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * access_token验证登录
|
|
|
+ *
|
|
|
+ * @param request
|
|
|
+ */
|
|
|
+ private User getUserByAccessToken(HttpServletRequest request) {
|
|
|
+ String token = request.getParameter(PARAM_ACCESS_TOKEN);
|
|
|
+ String type = request.getParameter(PARAM_CLIENT_TYPE);
|
|
|
+ // 发现有采用access_token方式
|
|
|
+ if (CLIENT_TYPE_MANAGE.equals(type) && token != null) {
|
|
|
+ // 清除上一次访问的数据
|
|
|
+ Object sessionUser = request.getSession().getAttribute("user");
|
|
|
+ if (sessionUser != null) {
|
|
|
+ // session里面原先存在user信息,接下来要判断此user是否与token绑定的user信息一致
|
|
|
+ // 一致则跳过,无需再次验证;不一致则替换
|
|
|
+ User user = (User) sessionUser;
|
|
|
+ if (UserCreater.isVirtual(user)) {
|
|
|
+ return user;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ Map<String, Object> data = accessTokenService.validFormManage(token);
|
|
|
+ if (data.containsKey("user") && data.containsKey("bind")) {
|
|
|
+ long enUU = Long.parseLong(data.get("bind").toString());
|
|
|
+ Enterprise enterprise = enterpriseService.findById(enUU);
|
|
|
+ if (enterprise != null) {
|
|
|
+ List<Role> roles = roleService.findByEnterprise(enUU);
|
|
|
+ // 虚拟用户
|
|
|
+ User user = UserCreater.createVirtual(String.valueOf(data.get("user")), enterprise, roles);
|
|
|
+ return user;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 获取登录地址
|
|
|
*
|
|
|
@@ -285,16 +209,64 @@ public class SSOInterceptor extends B2bAbstractSSOInterceptor {
|
|
|
* @param response response
|
|
|
* @param authorized 验证是否通过
|
|
|
*/
|
|
|
- protected void setResponseAuthorized(HttpServletResponse response, User user, boolean authorized) {
|
|
|
+ protected void setResponseAuthorized(HttpServletResponse response, boolean authorized) {
|
|
|
Integer status = authorized ? HttpStatus.OK.value() : HttpStatus.UNAUTHORIZED.value();
|
|
|
response.setStatus(status);
|
|
|
- if (null != user && null != user.getEnterprise()) {
|
|
|
- response.setStatus(authorized ? HttpStatus.OK.value() : HttpStatus.UNAUTHORIZED.value());
|
|
|
- String authorizedValue = authorized ? HttpStatus.OK.name() : HttpStatus.UNAUTHORIZED.name();
|
|
|
- response.setHeader("authorized", authorizedValue);
|
|
|
- }
|
|
|
+ String authorizedValue = authorized ? HttpStatus.OK.name() : HttpStatus.UNAUTHORIZED.name();
|
|
|
+ response.setHeader("authorized", authorizedValue);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 处理验证失败,有两种情况:<br/>
|
|
|
+ * 1. cookie没有带uid<br/>
|
|
|
+ * 2. cookie有带uid,但找不到有效的用户
|
|
|
+ * @param request
|
|
|
+ * @param response
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private boolean parseAuthenticateFailed(HttpServletRequest request, HttpServletResponse response) {
|
|
|
+ request.getSession().removeAttribute("user");
|
|
|
+ SystemSession.clear();
|
|
|
+
|
|
|
+ if (isRedirectAble(request)) {
|
|
|
+ logger.info("logout. request url:" + request.getRequestURL());
|
|
|
+ try {
|
|
|
+ sendRedirect(request, response);
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (SecurityConstant.AUTHENTICATION_URL.equals(request.getRequestURI())) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ AntPathRequestMatcher matcher = new AntPathRequestMatcher("/account/enterprise/info/**");
|
|
|
+ if (matcher.matches(request)) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ setResponseAuthorized(response, false);
|
|
|
+ if (!isRedirectAble(request)) {
|
|
|
+ try {
|
|
|
+ printJson(response, new ModelMap("loginUrl", getLoginPage(request, response)));
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理验证成功
|
|
|
+ * @param request
|
|
|
+ * @param response
|
|
|
+ * @param user
|
|
|
+ */
|
|
|
+ private void parseAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, User user) {
|
|
|
+ request.getSession().setAttribute("user", user);
|
|
|
+ SystemSession.setUser(user);
|
|
|
+ setResponseAuthorized(response, true);
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 验证成功
|
|
|
*
|
|
|
@@ -303,105 +275,124 @@ public class SSOInterceptor extends B2bAbstractSSOInterceptor {
|
|
|
*/
|
|
|
@Override
|
|
|
protected boolean onAuthenticateSuccess(HttpServletRequest request, HttpServletResponse response) {
|
|
|
- User user = (User) request.getSession().getAttribute("user");
|
|
|
SSOToken token = SSOHelper.attrToken(request);
|
|
|
- // cookie变化的情况下,session可能还未变化
|
|
|
- boolean onAuthenticateFailed = user == null || (user.getUserTel() != null && !token.getUid().equals(user.getUserTel()));
|
|
|
- if (onAuthenticateFailed) {
|
|
|
- user = getUserByToken(token);
|
|
|
- if (user != null) {
|
|
|
- user.setIp(AgentUtils.getIp(request));
|
|
|
- request.getSession().setAttribute("user", user);
|
|
|
- setGrantedAuthorities(user);
|
|
|
- log(request, user);
|
|
|
+ User user = getUserByToken(token);
|
|
|
+
|
|
|
+ if (user == null) {
|
|
|
+ return parseAuthenticateFailed(request, response);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (user.getEnterprise() == null) {
|
|
|
+ // 如果个人用户跳转至提示页面
|
|
|
+ return sendRedirectPersonal(response);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 记录日志
|
|
|
+ log(request, user);
|
|
|
+
|
|
|
+ // 验证管理员权限是否初始化
|
|
|
+ if (user.getUserUU().equals(user.getEnterprise().getEnAdminuu())) {
|
|
|
+ checkRoleAndReturnUserInfo(user);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 设置权限
|
|
|
+ setGrantedAuthorities(user);
|
|
|
+ // 进行权限验证
|
|
|
+ accessDecision(request, user);
|
|
|
+
|
|
|
+ parseAuthenticationSuccess(request, response, user);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 从token获取用户信息
|
|
|
+ *
|
|
|
+ * @param token token
|
|
|
+ * @return User
|
|
|
+ */
|
|
|
+ private User getUserByToken(SSOToken token) {
|
|
|
+ // 授权登录用户
|
|
|
+ User user = null;
|
|
|
+ if (null != token && token.getData() != null) {
|
|
|
+ UserAccount tokenUser = FlexJsonUtils.fromJson(token.getData(), UserAccount.class);
|
|
|
+ if (!StringUtils.isEmpty(tokenUser.getUserUU())) {
|
|
|
+ // dialectUID表示client系统自己的唯一标识,比如user_uu,手机号没设置的情况下使用
|
|
|
+ user = userService.findUserByUserUU(tokenUser.getUserUU());
|
|
|
+ } else if (!StringUtils.isEmpty(tokenUser.getMobile())) {
|
|
|
+ // UID表示所有系统公认的唯一标识,这里统一使用手机号
|
|
|
+ user = userService.findUserByUserTel(tokenUser.getMobile());
|
|
|
+ } else if (!StringUtils.isEmpty(tokenUser.getEmail())) {
|
|
|
+ // UID表示所有系统公认的唯一标识,这里统一使用手机号
|
|
|
+ user = userService.findUserByUserEmail(tokenUser.getEmail());
|
|
|
+ } else {
|
|
|
+ logger.error(String.format("invalid user %s, please set uid or dialectUID", tokenUser.getVipName()));
|
|
|
}
|
|
|
- } else {
|
|
|
- // 从其他应用切换了企业的情况
|
|
|
- if (token.getData() != null) {
|
|
|
- UserAccount tokenUser = FlexJsonUtils.fromJson(token.getData(), UserAccount.class);
|
|
|
- if (StringUtils.isEmpty(tokenUser.getBusinessCode()) || StringUtils.isEmpty(tokenUser.getSpaceUU())) {
|
|
|
- // 如果个人用户跳转至提示页面
|
|
|
- try {
|
|
|
- response.sendRedirect("/error_personal");
|
|
|
- } catch (IOException e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- return false;
|
|
|
- }
|
|
|
- // 如果是从个人用户切换或者当前企业切换
|
|
|
- boolean flag = null == user.getEnterprise() || !user.getEnterprise().getUu().equals(tokenUser.getSpaceUU());
|
|
|
- if (!StringUtils.isEmpty(tokenUser.getSpaceUU()) && flag) {
|
|
|
- user = getUserByToken(user, tokenUser);
|
|
|
+ if (user != null && user.getEnterprises() != null) {
|
|
|
+ // 企业资料在client系统自己的唯一标识,比如en_uu
|
|
|
+ if (tokenUser.getSpaceUU() != null) {
|
|
|
user.setCurrentEnterprise(tokenUser.getSpaceUU());
|
|
|
- request.getSession().setAttribute("user", user);
|
|
|
+ } else if (!StringUtils.isEmpty(tokenUser.getBusinessCode())) {
|
|
|
+ for (Enterprise enterprise : user.getEnterprises()) {
|
|
|
+ // 企业资料在所有系统公认的唯一标识,这里使用商业登记证号
|
|
|
+ if (tokenUser.getBusinessCode().equals(enterprise.getEnBussinessCode())) {
|
|
|
+ user.setEnterprise(enterprise);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- if (user != null) {
|
|
|
- // 判断是否个人用户,如果个人用户跳转至提示页面
|
|
|
- if (checkIsPersonal(user)) {
|
|
|
- try {
|
|
|
- response.sendRedirect("/error_personal");
|
|
|
- } catch (IOException e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- return false;
|
|
|
- }
|
|
|
- // 登录之前判断在当前企业的角色信息
|
|
|
- if (null != user.getEnterprise() && user.getEnterprise().getEnAdminuu().equals(user.getUserUU())) {
|
|
|
- Enterprise enterprise = user.getEnterprise();
|
|
|
- user = checkRoleAndReturnUserInfo(user, enterprise);
|
|
|
- user.setCurrentEnterprise(enterprise.getUu());
|
|
|
- }
|
|
|
- SystemSession.setUser(user);
|
|
|
- setResponseAuthorized(response, user, true);
|
|
|
- try {
|
|
|
- accessDecision(request, user);
|
|
|
- } catch (IOException e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
+ return user;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 跳转至个人用户提示页面
|
|
|
+ * @param response
|
|
|
+ */
|
|
|
+ private boolean sendRedirectPersonal(HttpServletResponse response) {
|
|
|
+ try {
|
|
|
+ response.sendRedirect("/error_personal");
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
}
|
|
|
- return true;
|
|
|
+ return false;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 处理在商城注册企业并切换到新企业未同步到商城问题
|
|
|
- * @param user
|
|
|
- * @param tokenUser
|
|
|
- * @return
|
|
|
+ * 校验角色信息,返回用户信息
|
|
|
+ *
|
|
|
+ * @param user 用户
|
|
|
+ * @return User
|
|
|
*/
|
|
|
- private User getUserByToken(User user, UserAccount tokenUser) {
|
|
|
- Set<Enterprise> enterprises = user.getEnterprises();
|
|
|
- if (!CollectionUtils.isEmpty(enterprises)) {
|
|
|
- List<Enterprise> correctEnterprises = enterprises.stream().filter(enter -> enter.getUu().equals(tokenUser.getSpaceUU())).collect(Collectors.toList());
|
|
|
- if (CollectionUtils.isEmpty(correctEnterprises)) {
|
|
|
- cacheManager.getCacheManager().clearAllStartingWith("com.uas.platform.b2b.model.User");
|
|
|
- User current = userDao.findOne(tokenUser.getUserUU());
|
|
|
- if (!StringUtils.isEmpty(current)) {
|
|
|
- user = current;
|
|
|
- logger.info("从数据库查找的企业:" + tokenUser.getSpaceUU());
|
|
|
- } else {
|
|
|
- logger.info("未查询到用户信息" + tokenUser.getUserUU());
|
|
|
+ private void checkRoleAndReturnUserInfo(User user) {
|
|
|
+ // 设置为本企业管理员
|
|
|
+ List<Role> adminList = roleDao.findByEnUUAndDesc(user.getEnterprise().getUu(), "管理员");
|
|
|
+ Set<Role> existRoles = user.getRoles();
|
|
|
+ if (!org.springframework.util.CollectionUtils.isEmpty(adminList)) {
|
|
|
+ final boolean[] exist = {false};
|
|
|
+ existRoles.forEach(role -> {
|
|
|
+ if (Objects.equals(role.getId(), adminList.get(0).getId())) {
|
|
|
+ exist[0] = true;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ if (!exist[0]) {
|
|
|
+ user.getRoles().add(adminList.get(0));
|
|
|
+ try {
|
|
|
+ userDao.save(user);
|
|
|
+ } catch (Exception e) {
|
|
|
+ // 这里存储异常情况通常是角色存在,因为上面已经添加角色信息,这里直接返回user,不做处理
|
|
|
+ logger.info("存储异常" + e.getMessage());
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- return user;
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 检验是否个人用户
|
|
|
- *
|
|
|
- * @param user 用户信息
|
|
|
- */
|
|
|
- private boolean checkIsPersonal(User user) {
|
|
|
- boolean personalAccount = null == user.getEnterprise() || (null != user.getEnterprise() && null == user.getEnterprise().getUu());
|
|
|
- return personalAccount;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 权限验证
|
|
|
+ /**
|
|
|
+ * 验证权限
|
|
|
+ * @param request
|
|
|
+ * @param user
|
|
|
*/
|
|
|
- private void accessDecision(HttpServletRequest request, User user) throws IOException {
|
|
|
+ private void accessDecision(HttpServletRequest request, User user) {
|
|
|
Collection<ConfigAttribute> configAttributes = getAttributes(request);
|
|
|
if (null == configAttributes || configAttributes.size() == 0 || user.isSys() || user.getUserUU() < 0) {
|
|
|
return;
|
|
|
@@ -485,77 +476,13 @@ public class SSOInterceptor extends B2bAbstractSSOInterceptor {
|
|
|
}
|
|
|
|
|
|
private void setGrantedAuthorities(User user) {
|
|
|
- Set<GrantedAuthority> authSet = new HashSet<GrantedAuthority>();
|
|
|
- user.setCurrentEnterpriseRoles();
|
|
|
- Set<Role> roles = user.getRoles();
|
|
|
- if (!CollectionUtils.isEmpty(roles)) {
|
|
|
- for (Role role : roles) {
|
|
|
- // 超级账号
|
|
|
- if (role.isSys()) {
|
|
|
- user.setIssys(Constant.YES);
|
|
|
- break;
|
|
|
- }
|
|
|
- Set<ResourceItem> resourceItems = role.getResourceItems();
|
|
|
- if (!CollectionUtils.isEmpty(resourceItems)) {
|
|
|
- for (ResourceItem res : resourceItems) {
|
|
|
- authSet.add(new SimpleGrantedAuthority(res.getName()));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ Set<GrantedAuthority> authSet = user.getAuthSet();
|
|
|
if (authorities == null) {
|
|
|
authorities = new HashMap<>(1);
|
|
|
}
|
|
|
authorities.put(user.getUserUU(), authSet);
|
|
|
}
|
|
|
|
|
|
- private final static String tokenParam = "access_token";
|
|
|
- private final static String typeParam = "client_type";
|
|
|
-
|
|
|
- /**
|
|
|
- * access_token验证登录
|
|
|
- *
|
|
|
- * @param request
|
|
|
- */
|
|
|
- private User getUserByAccessToken(HttpServletRequest request) {
|
|
|
- String token = request.getParameter(tokenParam);
|
|
|
- // 发现有采用access_token方式
|
|
|
- if (token != null) {
|
|
|
- // 清除上一次访问的数据
|
|
|
- SystemSession.clear();
|
|
|
- Object sUser = request.getSession().getAttribute("user");
|
|
|
- User user = null;
|
|
|
- if (sUser != null) {
|
|
|
- // session里面原先存在user信息,接下来要判断此user是否与token绑定的user信息一致
|
|
|
- // 一致则跳过,无需再次验证;不一致则替换
|
|
|
- user = (User) sUser;
|
|
|
- }
|
|
|
- String type = request.getParameter(typeParam);
|
|
|
- String MANAGE_TYPE = "manage";
|
|
|
- if (MANAGE_TYPE.equals(type)) {
|
|
|
- if (user != null && UserCreater.isVirtual(user)) {
|
|
|
- return user;
|
|
|
- }
|
|
|
- Map<String, Object> data = accessTokenService.validFormManage(token);
|
|
|
- // user key
|
|
|
- String USER_KEY = "user";
|
|
|
- // bind key
|
|
|
- String BIND_KEY = "bind";
|
|
|
- if (data.containsKey(USER_KEY) && data.containsKey(BIND_KEY)) {
|
|
|
- long enUU = Long.parseLong(data.get("bind").toString());
|
|
|
- Enterprise enterprise = enterpriseService.findById(enUU);
|
|
|
- if (enterprise != null) {
|
|
|
- List<Role> roles = roleService.findByEnterprise(enUU);
|
|
|
- // 虚拟用户
|
|
|
- user = UserCreater.createVirtual(String.valueOf(data.get("user")), enterprise, roles);
|
|
|
- return user;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 记录登录日志
|
|
|
*
|
|
|
@@ -564,6 +491,7 @@ public class SSOInterceptor extends B2bAbstractSSOInterceptor {
|
|
|
*/
|
|
|
private void log(HttpServletRequest request, User user) {
|
|
|
SitePreference preference = getDefaultSitePreferenceForDevice(this.deviceResolver.resolveDevice(request));
|
|
|
+ user.setIp(AgentUtils.getIp(request));
|
|
|
signinLogService.save(new SigninLog(user, preference, true));
|
|
|
}
|
|
|
|
|
|
@@ -586,60 +514,4 @@ public class SSOInterceptor extends B2bAbstractSSOInterceptor {
|
|
|
return SitePreference.NORMAL;
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 自动登录
|
|
|
- *
|
|
|
- * <pre>
|
|
|
- * 旧方式
|
|
|
- * </pre>
|
|
|
- */
|
|
|
- @Deprecated
|
|
|
- private User autoLogin(HttpServletRequest request) {
|
|
|
- String enUU = request.getParameter("b_enuu");
|
|
|
- String username = request.getParameter("b_username");
|
|
|
- String password = request.getParameter("b_password");
|
|
|
- User user = null;
|
|
|
- if (StringUtils.hasText(username) && StringUtils.hasText(password)) {
|
|
|
- // 邮箱登录
|
|
|
- String MAIL_SIGN = "@";
|
|
|
- if (username.contains(MAIL_SIGN)) {
|
|
|
- user = userService.findUserByUserEmail(username);
|
|
|
- } else if (username.matches(TEL_REGEXP)) {
|
|
|
- // 手机号登录
|
|
|
- user = userService.findUserByUserTel(username);
|
|
|
- } else if (username.matches(UU_REGEXP)) {
|
|
|
- user = userService.findUserByUserUU(Long.parseLong(username));
|
|
|
- }
|
|
|
- if (user != null && user.getUserPwd().equals(Md5Utils.encode(password, user.getUserUU()))) {
|
|
|
- checkEnterprise(user, enUU);
|
|
|
- user.setIp(AgentUtils.getIp(request));
|
|
|
- request.getSession().setAttribute("user", user);
|
|
|
- setGrantedAuthorities(user);
|
|
|
- } else {
|
|
|
- throw new UsernameNotFoundException(username + " 账号或密码错误");
|
|
|
- }
|
|
|
- }
|
|
|
- return user;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 绑定企业
|
|
|
- *
|
|
|
- * @param user 用户信息
|
|
|
- * @param enUU 企业UU
|
|
|
- */
|
|
|
- private void checkEnterprise(User user, String enUU) {
|
|
|
- boolean chosen = false;
|
|
|
- for (Enterprise enterprise : user.getEnterprises()) {
|
|
|
- if (enterprise.getUu().toString().equals(enUU)) {
|
|
|
- user.setEnterprise(enterprise);
|
|
|
- chosen = true;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- if (!chosen) {
|
|
|
- throw new UsernameNotFoundException("企业与用户不匹配");
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
}
|