关键词:登录页配置、指定用户允许登录、单点登录
一、需求
用户有自己的cas service系统,苍穹需要实现与cas service系统认证,可以通过SSO插件机智实现。这样客户有多套业务系统,只需通同一个登录页面(非苍穹登录页面)输入账号密码就可以登录所有系统。
但是多套系统的原有登录页面还是存在的,用户也能通过原有页面登录指定系统。但是客户不想让普通用户通过系统原有页面登录,普通用户只能通过cas service认证中心统一的页面登录,特定的用户或管理员才可以(苍穹登录页面)登录。
因为每套系统的管理员用户也有可能是不一样的,比如:苍穹的超级管理员是administrator,其他系统的是admin之类的
二、思路与方案
通过服务端的控制:
1、编写插件继承LoginAfterBase类的实现handling方法
2、在插件中添加自己的业务逻辑判断,把不允许登录的用户抛出异常
3、在MC配置参数login.after.handle.classes,值就是你的全限定类名
三、实现过程
1、编写插件继承LoginAfterBase类的实现handling方法
public class LoginLimitTest extends LoginAfterBase { /** * 完成登录后处理任务 * @param request * @param sessionInfo 用户信息 */ @Override public void handling(HttpServletRequest httpServletRequest, SessionInfo sessionInfo) { String userId = sessionInfo.getUserId(); List<Long> userIds = new ArrayList<>(1); userIds.add(Long.valueOf(userId)); List<Map<String, Object>> userInfoList = UserServiceHelper.get(userIds); if(userInfoList.size() > 0){ Map<String, Object> usermap = userInfoList.get(0); //通过工号判断,只允许administrator用户登录;可自行通过其他条件判断 String number = (String) usermap.get("number"); if(!StringUtils.equals("administrator",number)){ throw new KDException(BosErrorCode.requestContext, ResManager.loadKDString("业务人员不能从该页面登录!", null, "LoginLimitTest.java")); } } } }
2、在MC配置参数login.after.handle.classes,值就是你的全限定类名;保存并发布集群
四、效果图
图2
五、开发环境版本
不限,本样例采用的轻量级环境,版本是: 苍穹版本号 COSMICV4.0.014.0 星瀚版本号 CONSTELLATIONV4.0.014.0
六、注意事项
一开始的思路是通过前端js去控制:
后来发现前端控制需要编写很多判断,比如点击登录按钮或者通过回车键(enter)登录,都需要写相应的逻辑,而且前端是不可控的,有些人还是可以通过修改某些页面元素实现登录的。前端的一切操作都是不可靠的,可以被绕过的。
七、参考资料
推荐阅读