keycloak Java Servlet Filter Adapter 使用示例

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

猜你喜欢

转载自huangqiqing123.iteye.com/blog/2419441
今日推荐