首页 > 社交 > 科普中国

机床解锁

常驻编辑 科普中国 2022-06-11 单点   车床   示例   用户信息   解锁   机床   接口   需求   密码   代码   方式   用户   系统

机床解锁 车床解锁 【一电一 17154833762- 开发中突然接到一个新的需求,需要在原始系统中加入一个单点登录的功能,这不是很简单的一个需求吗,几行代码就可以搞定的事。拿到文档后直接开搞,发现用户方提供了一个token查询用户信息的接口,那么需求变得更清晰了,写一个链接,参数就是用户方的token,完事拿着token去请求平台接口,将获取到的用户信息直接注册到平台。下面写一点伪代码意思一下:RWZ拜客生活常识网

public void sso(String token){
    Result result = HttpUtil.post(url+token);
    if(result.isOk()){
        User user = result.data();
        if(!check(user)){
            // 如果用户在系统中不存在
            register(user);
        }
        //将单点登录的用户登录系统中
        login(user.getLoginName(),user.getPassword());
    }
}

以上代码基本解决了登录问题,本来这样就可以交差了,但是突然想到,系统还有锁屏以及定时修改密码等问题,因此单点登录需要绕过密码登录,但是系统使用的是shiro,realm是用的密码和账号授权很显然无法满足了。因此笔者想到了以下两种方案:RWZ拜客生活常识网

  1. 单点登录完成,自动初始化密码,保证库内密码一致
  2. 改造系统登录模块,增加单独针对sso的realm

很显然,这里第二种方案更靠谱,下面开始登录改造。RWZ拜客生活常识网

一、创建单点登录需要的Token类

使用shiro登录时默认会使用UsernamePasswordToken,我们这边为了实现忽略密码的方式,这里直接选择继承BearerToken,进行自定义token,这里贴出部分代码,可以根据自己需求就行更改RWZ拜客生活常识网

public class SSOToken extends BearerToken {

  private SysUser user;

  public SSOToken(SysUser user,String token) {
      super(token);
      this.user = user;
  }

  public SysUser getUser() {
      return user;
  }

  public void setUser(SysUser user) {
      this.user = user;
  }

}

二、创建单点登录使用的realm

众所周知,shiro登录及权限获取的逻辑主要是在realm中实现,默认情况下,我们创建一个realm用于密码登录即可,这里为实现用户名密码和token两种登录方式,需要创建两个realm,此处自己贴出自定义代码,读者可按需修改RWZ拜客生活常识网

public class SSORealm extends AuthorizingRealm implements Serializable {

    /**
     * 授权
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {

        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        Set roles = new HashSet<>();
        roles.add("admin");
        info.setRoles(roles);
        return info;
    }

    /**
     * 登录认证
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        SSOToken upToken = (SSOToken) token;
        // 获取sso登录传入的user实体
        User user = upToken.getUser();

        //不传入拒绝登录
        if(user==null){
            throw new UnknownAccountException();
        }

        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, upToken.getToken(), getName());
        return info;

    }

}

三、自定义身份验证器

编写一个自定义的身份验证器,根据条件选择指定的realm进行登录验证。RWZ拜客生活常识网

public enum LoginType {

    SSO("SSORealm"),USERNAME("UserRealm");

    private final String type;

    LoginType(String type) {
        this.type = type;
    }

    @Override
    public String toString() {
        return type;
    }
}

@Component
public class CustomModularRealmAuthenticator extends ModularRealmAuthenticator {
    @Override
    protected AuthenticationInfo doAuthenticate(AuthenticationToken authenticationToken) throws AuthenticationException {
        assertRealmsConfigured();
        Collection realms = getRealms();
        Collection typeRealms = new ArrayList    

相关阅读:

  • “从小就瘦的娃,反而有优势!”3张图告诉你:这种瘦孩子很
  • 华南强降雨减弱但汛情依然严峻 气象专家:需注意单点强
  • 王者荣耀戈娅怎么玩
  • 超增压瀑布洗澎湃大水量
  • 小鹏G9:摊牌了
  • Citrix通过Azure
  • 11.15日体验服花木兰削弱,暃、东皇加强,赵怀真机制再度
  • 大佬神作!Spring
  • 肖战首次裸眼3D大片,闪现重庆引无数路人驻足,不愧是顶流
  • 全新EMUI9.0在IFA2018亮相,国内Beta推送或将于9月5日开
    • 网站地图 |
    • 声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不做权威认证,如若验证其真实性,请咨询相关权威专业人士。