1、添加依赖,如在pom.xml文件中添加
<dependency> <groupId>org.keycloak</groupId> <artifactId>keycloak-servlet-filter-adapter</artifactId> <version>3.4.3.Final</version> </dependency>
2、在web.xml文件中配置keycloak filter,需注意:将keycloak filter放在其他filter之前。
<filter> <filter-name>Keycloak Filter</filter-name> <filter-class>org.keycloak.adapters.servlet.KeycloakOIDCFilter</filter-class> </filter> <filter-mapping> <filter-name>Keycloak Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
3、新建中转filter,该filter需放在keycloak filter之后,其他filter之前,负责解析keycloak安全上下文信息(用户信息、角色信息等),并构建业务自己的安全上下文。
中转filter代码示例
public class TestFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; RefreshableKeycloakSecurityContext context = (RefreshableKeycloakSecurityContext)request.getAttribute("org.keycloak.KeycloakSecurityContext"); //或者 //= (RefreshableKeycloakSecurityContext)request.getSession().getAttribute("org.keycloak.KeycloakSecurityContext"); AccessToken token = context.getToken(); String sub = token.getSubject();//用户内码 System.out.println(sub); String loginName = token.getPreferredUsername();//登录账号 System.out.println(loginName); //Realm角色列表 Access access = token.getRealmAccess(); Set<String> roles = access.getRoles(); System.out.println(roles); //client角色列表 //Map<clientId,roleList> Map<String, Access> ma = token.getResourceAccess(); for (String key : ma.keySet()) { System.out.println(key);//clientID //当前用户在key client中拥有的角色列表 System.out.println(ma.get(key).getRoles()); } //构建业务应用自己的安全上下文 request.getSession().setAttribute("loginName", loginName); //请求继续传递 chain.doFilter(req, res); } @Override public void init(FilterConfig arg0) throws ServletException { } @Override public void destroy() { } }
4、在业务应用的web.xml中配置中转filter,需注意:该filter需放在keycloak filter之后,其他filter之前。
<filter> <filter-name>testFilter</filter-name> <filter-class>com.TestFilter</filter-class> </filter> <filter-mapping> <filter-name>testFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
5、在keycloak中为业务应用创建client、用户、角色
6、使用keycloak生成该client的keycloak.json.
7、将生成的keycloak.json文件放到业务应用的WEB-INF目录下。
8、重启应用,访问业务应用,将会自动转向keycloak的登录页面,登录成功后,回跳至业务应用的初始访问地址。
9、完工。
更多内容参考:
https://www.keycloak.org/docs/latest/securing_apps/index.html#_servlet_filter_adapter