目录
首先,关于IAM的详细介绍,网上比比皆是,我这里就不一一阐述了,可以借鉴部分文章
例如:
零信任之从IAM概述到应用实现_H3C-Navigator的博客-CSDN博客
我这里这次升级的是旧的项目,SSI一个很老的项目了,因为一些核心的代码都是在这个里面,一直都是将就着用,后续的话肯定也是会更新迭代或者下线的。
废话不多说,我们看下IAM的一些简单的配置
我这边是把IAM对应的一些方法,调用整合在了一起,打包成了一个jar。主要就是搭建IAM的对应的应用了。升级的话还是比较简单的,看对应的应用需要什么结果
IAM认证通过,就返回对应的参数数据。
结构如下。
代码示例
package cn.axa.common;
import cn.axa.entity.User;
import cn.axa.utils.HttpClientUtilBasic;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
@Component
public class SecurityHelper
{
private static final String ANONYMITY = "anonymity";
private static final String COMMON_ACCOUNT_TYPE = "COMMON_ACCOUNT_TYPE:";
private static final Map<String, String> REMOTE_URL = new HashMap();
@Value("${oauth2.interface.client.id:app}")
private String clientId;
@Value("${oauth2.interface.client.secret:secret}")
private String clientSecret;
@Value("${DISCONF_ENV:sit}")
private String env;
public static Authentication getUserDetails() { return SecurityContextHolder.getContext().getAuthentication(); }
public User getUserInfo(String account, String accountType, String sysName)
throws Exception
{
try
{
Map param = new HashMap();
param.put("account", account);
param.put("accountType", accountType);
param.put("sysName", sysName);
Object content = HttpClientUtilBasic.postGetUserInfo((String)REMOTE_URL.get(this.env), JSON.toJSONString(param), this.clientId, this.clientSecret);
JSONObject jsonObject = JSONObject.parseObject(content.toString());
return (User)JSON.toJavaObject(jsonObject.getJSONObject("data"), User.class);
} catch (Exception e) {
throw new Exception(e.getMessage());
}
}
public static String getAccountType() {
Authentication authentication = getUserDetails();
for (GrantedAuthority auth : authentication.getAuthorities()) {
if (auth.getAuthority().contains("COMMON_ACCOUNT_TYPE:")) {
return auth.getAuthority().split(":")[1];
}
}
return null;
}
public static List<String> getCurrentRole() {
List roles = new LinkedList();
Authentication authentication = getUserDetails();
if (authentication != null) {
for (GrantedAuthority ga : authentication.getAuthorities()) {
roles.add(ga.getAuthority());
}
}
return roles;
}
public static String[] getRoles() {
List roles = new LinkedList();
Authentication authentication = getUserDetails();
if (authentication != null) {
for (GrantedAuthority ga : authentication.getAuthorities()) {
roles.add(ga.getAuthority());
}
}
if (roles.size() != 0) {
String[] roleArr = new String[roles.size()];
for (int i = 0; i < roles.size(); i++) {
roleArr[i] = ((String)roles.get(i));
}
return roleArr;
}
return null;
}
public static String getUserName()
{
Authentication authentication = getUserDetails();
String username;
String username;
if (authentication != null)
username = (String)authentication.getPrincipal();
else {
username = "anonymity";
}
return username;
}
static
{
REMOTE_URL.put("sit", "测试环境");
REMOTE_URL.put("uat", "业务测试环境");
REMOTE_URL.put("preprod", "预生产");
REMOTE_URL.put("gray", "灰度");
REMOTE_URL.put("prod", "生产");
}
}
对于我现在升级的这个应用的话,是需要的账户权限以及对应账户的菜单权限CODE。
首先我们看下是如何集成
第一步:
引入jar 两种方式 pom文件 或者直接添加jar
<dependency>
<groupId>*****</groupId>
<artifactId>oauth-client-mvc</artifactId>
<version>1.1</version>
</dependency
第二步:
配置对应的参数
#应用首页地址
oauth2.access.url=应用首页地址
#客户端id
oauth2.clientId=项目名
#客户端密钥
oauth2.clientSecret=对应的秘钥
#SSO服务端地址
oauth2.region.url=https://sits.*****/ssooauth2
#oauth2.region.url=https://uats.*****/ssooauth2
#oauth2.region.url=https://*****
#oauth2.region.url=https://*****
#客户端应用自身域地址
oauth2.domain=*****
#应用放行地址(无需登录即可访问)
oauth2.ignore.url=["/healthcheck.do","/logout.do","/proxylogin.do"]
#客户端ID
oauth2.interface.client.id=项目名
#密钥
oauth2.interface.client.secret=秘钥
#应用环境
DISCONF_ENV=sit
#DISCONF_ENV=uat
#DISCONF_ENV=preprod
#DISCONF_ENV=prod
第三步:
web.xml配置Spring Security过滤器链
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filterclass>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
第四步:
配置拦截器和包扫描地址
在servlet.xml中添加如下配置:
<context:component-scan base-package="包路径"/>
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/配置要过滤的静态路径"/>
<bean class="cn.axa.common.AdminInterceptorOrHttpClient"></bean>
</mvc:interceptor>
</mvc:interceptors>
项目升级中遇到的问题
注意:
Spring- security-jar包需要>=4.2.5
后续会有升级对应的springboot 升级完成之后,中间遇到的一些问题难点。 我也会更新进来。
谢谢大家。