Преглед изворни кода

通信参数使用upms_前缀,并增加client无密认证

shuzheng пре 9 година
родитељ
комит
ce7395871c

+ 13 - 9
zheng-upms/zheng-upms-client/src/main/java/com/zheng/upms/client/shiro/filter/UpmsAuthenticationFilter.java

@@ -1,10 +1,12 @@
 package com.zheng.upms.client.shiro.filter;
 
+import com.alibaba.fastjson.JSONObject;
 import com.zheng.common.util.PropertiesFileUtil;
 import com.zheng.common.util.RedisUtil;
 import com.zheng.upms.client.shiro.session.UpmsSessionDao;
 import com.zheng.upms.client.util.RequestParameterUtil;
 import com.zheng.upms.common.constant.UpmsConstant;
+import com.zheng.upms.common.constant.UpmsResultConstant;
 import org.apache.commons.lang.StringUtils;
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpResponse;
@@ -16,7 +18,9 @@ import org.apache.http.client.methods.HttpPost;
 import org.apache.http.impl.client.DefaultHttpClient;
 import org.apache.http.message.BasicNameValuePair;
 import org.apache.http.util.EntityUtils;
+import org.apache.shiro.authc.UsernamePasswordToken;
 import org.apache.shiro.session.Session;
+import org.apache.shiro.subject.SimplePrincipalCollection;
 import org.apache.shiro.subject.Subject;
 import org.apache.shiro.web.filter.authc.AuthenticationFilter;
 import org.apache.shiro.web.util.WebUtils;
@@ -97,11 +101,6 @@ public class UpmsAuthenticationFilter extends AuthenticationFilter {
         Session session = subject.getSession();
         String sessionId = session.getId().toString();
         int timeOut = (int) session.getTimeout() / 1000;
-        // 是否开发模式,为true则直接放行
-        boolean debug = PropertiesFileUtil.getInstance("zheng-upms-client-shiro").getBool("debug");
-        if (debug) {
-            return true;
-        }
         // 判断局部会话是否登录
         String cacheClientSession = RedisUtil.get(ZHENG_UPMS_CLIENT_SESSION_ID + "_" + session.getId());
         if (StringUtils.isNotBlank(cacheClientSession)) {
@@ -124,7 +123,7 @@ public class UpmsAuthenticationFilter extends AuthenticationFilter {
             }
         }
         // 判断是否有认证中心code
-        String code = request.getParameter("code");
+        String code = request.getParameter("upms_code");
         // 已拿到code
         if (StringUtils.isNotBlank(code)) {
             // HttpPost去校验code
@@ -140,23 +139,28 @@ public class UpmsAuthenticationFilter extends AuthenticationFilter {
                 HttpResponse httpResponse = httpclient.execute(httpPost);
                 if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                     HttpEntity httpEntity = httpResponse.getEntity();
-                    String result = EntityUtils.toString(httpEntity);
-                    if (result.equals("success")) {
+                    JSONObject result = JSONObject.parseObject(EntityUtils.toString(httpEntity));
+                    if (1 == result.getIntValue("code") && result.getString("data").equals(code)) {
                         // code校验正确,创建局部会话
                         RedisUtil.set(ZHENG_UPMS_CLIENT_SESSION_ID + "_" + sessionId, code, timeOut);
                         // 保存code对应的局部会话sessionId,方便退出操作
                         RedisUtil.sadd(ZHENG_UPMS_CLIENT_SESSION_IDS + "_" + code, sessionId, timeOut);
-                        _log.info("当前code={},对应的注册系统个数:{}个", code, RedisUtil.getJedis().scard(ZHENG_UPMS_CLIENT_SESSION_IDS + "_" + code));
+                        _log.debug("当前code={},对应的注册系统个数:{}个", code, RedisUtil.getJedis().scard(ZHENG_UPMS_CLIENT_SESSION_IDS + "_" + code));
                         // 移除url中的token参数
                         String backUrl = RequestParameterUtil.getParameterWithOutCode(WebUtils.toHttp(request));
                         // 返回请求资源
                         try {
+                            // client无密认证
+                            String username = request.getParameter("upms_username");
+                            subject.login(new UsernamePasswordToken(username, ""));
                             HttpServletResponse httpServletResponse = WebUtils.toHttp(response);
                             httpServletResponse.sendRedirect(backUrl.toString());
                             return true;
                         } catch (IOException e) {
                             _log.error("已拿到code,移除code参数跳转出错:", e);
                         }
+                    } else {
+                        _log.warn(result.getString("data"));
                     }
                 }
             } catch (IOException e) {

+ 6 - 0
zheng-upms/zheng-upms-client/src/main/java/com/zheng/upms/client/shiro/realm/UpmsRealm.java

@@ -1,6 +1,7 @@
 package com.zheng.upms.client.shiro.realm;
 
 import com.zheng.common.util.MD5Util;
+import com.zheng.common.util.PropertiesFileUtil;
 import com.zheng.upms.dao.model.UpmsPermission;
 import com.zheng.upms.dao.model.UpmsRole;
 import com.zheng.upms.dao.model.UpmsUser;
@@ -74,6 +75,11 @@ public class UpmsRealm extends AuthorizingRealm {
     protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
         String username = (String) authenticationToken.getPrincipal();
         String password = new String((char[]) authenticationToken.getCredentials());
+        // client无密认证
+        String upmsType = PropertiesFileUtil.getInstance("zheng-upms-client-shiro").get("upms.type");
+        if ("client".equals(upmsType)) {
+            return new SimpleAuthenticationInfo(username, password, getName());
+        }
 
         // 查询用户信息
         UpmsUser upmsUser = upmsApiService.selectUpmsUserByUsername(username);

+ 7 - 5
zheng-upms/zheng-upms-server/src/main/java/com/zheng/upms/server/controller/SSOController.java

@@ -1,5 +1,6 @@
 package com.zheng.upms.server.controller;
 
+import com.alibaba.fastjson.JSONObject;
 import com.zheng.common.base.BaseController;
 import com.zheng.common.util.RedisUtil;
 import com.zheng.upms.client.shiro.session.UpmsSession;
@@ -91,13 +92,14 @@ public class SSOController extends BaseController {
         if (StringUtils.isNotBlank(code)) {
             // 回跳
             String backurl = request.getParameter("backurl");
+            String username = (String) subject.getPrincipal();
             if (StringUtils.isBlank(backurl)) {
                 backurl = "/";
             } else {
                 if (backurl.contains("?")) {
-                    backurl += "&code=" + code;
+                    backurl += "&upms_code=" + code + "&upms_username=" + username;
                 } else {
-                    backurl += "?code=" + code;
+                    backurl += "?upms_code=" + code + "&upms_username=" + username;
                 }
             }
             _log.debug("认证中心帐号通过,带code回跳:{}", backurl);
@@ -165,13 +167,13 @@ public class SSOController extends BaseController {
     @ApiOperation(value = "校验code")
     @RequestMapping(value = "/code", method = RequestMethod.POST)
     @ResponseBody
-    public String code(HttpServletRequest request) {
+    public Object code(HttpServletRequest request) {
         String codeParam = request.getParameter("code");
         String code = RedisUtil.get(ZHENG_UPMS_SERVER_CODE + "_" + codeParam);
         if (StringUtils.isBlank(codeParam) || !codeParam.equals(code)) {
-            return "failed";
+            new UpmsResult(UpmsResultConstant.FAILED, "无效code");
         }
-        return "success";
+        return new UpmsResult(UpmsResultConstant.SUCCESS, code);
     }
 
     @ApiOperation(value = "退出登录")