首先,关于IAM的详细介绍,网上比比皆是,我这里就不一一阐述了,可以借鉴部分文章
例如:
我这里这次升级的是旧的项目,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 升级完成之后,中间遇到的一些问题难点。 我也会更新进来。
谢谢大家。