项目集成shiro的时候,有写某个自定义类然后继承自AuthorizingRealm
并且重写实现了他的2个方法:
1、其中一个:认证回调 验证账户密码的
doGetAuthenticationInfo
2、另外一个:授权查询 验证权限的
doGetAuthorizationInfo
ok,上面没什么用,只是讲述一下,正真用到的是下面的代码
/** * 认证密码匹配调用方法 * @param authcToken * @param info * @throws AuthenticationException */ @Override protected void assertCredentialsMatch(AuthenticationToken authcToken, AuthenticationInfo info) throws AuthenticationException { UsernamePasswordToken token = (UsernamePasswordToken) authcToken; // 这里可以判断某个条件若单点登录,则使用单点登录授权方法;也可以符合某条件直接return返回跳过 if (!token.getUsername().equals("thinkgem")) { Map<String,Object> map = Maps.newConcurrentMap(); map.put("name",token.getUsername()); map.put("pwd",String.valueOf(token.getPassword())); // 调用sso连接认证 String result = HttpClientUtils.doGet(Global.getConfig("ssoLoginUrl"), map); if (result.equals("true")){ return; } } // 否则还是继续匹配(兜底方案) super.assertCredentialsMatch(token, info); }
其实也就重写了AuthorizingRealm类的assertCredentialsMatch方法,判断符合某个条件参数时直接返回或者使用别的渠道认证;
例子中是登录名如果不为thinkgem则使用特定的SSO调用