★想太多★ 2025-01-13 14:04 采纳率: 0%
浏览 161
已结题

springboot+vue 集成keycloak sso到阿里云

描述:springboot+vue 集成keycloak sso登录到其他服务,如阿里云。
现有条件:
keycloak sso到阿里云已调通,可以获取到登录地址ip+端口/auth/realms/LiveControl/protocol/saml;
springboot+vue服务

预期效果:
1.访问springboot 服务登录页面,输入账号名密码,验证通过,跳转到服务首页》访问登录页面时,不跳转keycloak登录页
2.在服务首页,点击《访问阿里云》按钮,直接无需登录重定向的阿里云首页。
上述需求要怎样实现,springboot,vue怎样配置

  • 写回答

38条回答 默认 最新

  • 青云交 优质创作者: 大数据技术领域 2025-01-13 21:32
    关注
    获得0.30元问题酬金

    博主,【青云交】为您带来了基于 Spring Boot + Vue 集成 Keycloak SSO 实现阿里云免登录重定向的深度指南:

    一、Keycloak 核心配置剖析

    (一)创建 Realm 与 Client

    1. Realm 创建:在 Keycloak 管理控制台,点击左上角 “Add Realm”。在 “Realm Name” 处输入自定义名称,如 “mySpringAliRealm”,这将作为你隔离应用和用户的独立空间。
    2. Client 配置:进入新创建的 Realm,在左侧菜单选择 “Clients”,点击 “Create”。“Client ID” 设为唯一标识,如 “spring - vue - client”。在 “Root URL” 中填入 Spring Boot 应用的根地址,“Valid Redirect URIs” 需包含 Spring Boot 应用的回调地址(如http://localhost:8080/login - oauth2/code/keycloak,若使用自定义路径则相应调整)以及阿里云相关地址(如https://*.aliyun.com/*,具体依阿里云集成要求)。
    3. 访问类型与标准流设置:将 “Access Type” 设为 “confidential”,确保安全的客户端认证。同时,启用 “Direct Access Grants Enabled” 和 “Standard Flow Enabled”。前者允许客户端直接获取令牌,适用于一些特定场景;后者则是实现 SSO 的标准 OAuth 2.0 授权码流程。

    (二)用户与角色管理

    1. 用户创建:在 Realm 的左侧菜单选择 “Users”,点击 “Add user”。填写用户名、邮箱等信息,设置初始密码。
    2. 角色分配:若需基于角色进行访问控制,先在 “Roles” 中创建角色,如 “admin”“user” 等。回到 “Users”,选中用户,在 “Role Mappings” 中分配相应角色。

    二、Spring Boot 与 Keycloak 深度集成

    (一)依赖引入

    在 Spring Boot 项目的pom.xml文件中,添加以下依赖:

    <dependency>
        <groupId>org.keycloak</groupId>
        <artifactId>keycloak - spring - boot - starter</artifactId>
    </dependency>
    

    这将引入 Keycloak 与 Spring Boot 集成所需的核心库。

    (二)配置文件设置

    application.properties文件中添加:

    keycloak.auth - server - url = http://your - keycloak - server/auth
    keycloak.realm = mySpringAliRealm
    keycloak.resource = spring - vue - client
    keycloak.credentials.secret = your - client - secret
    

    其中,auth - server - url为 Keycloak 服务器地址,realm为前面创建的 Realm 名称,resource是 Client ID,credentials.secret可在 Client 详情页的 “Credentials” 标签中获取。

    (三)安全配置类构建

    创建一个继承自KeycloakWebSecurityConfigurerAdapter的安全配置类:

    import org.keycloak.adapters.springsecurity.KeycloakSecurityComponents;
    import org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationProvider;
    import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.core.authority.mapping.SimpleAuthorityMapper;
    import org.springframework.security.core.session.SessionRegistryImpl;
    import org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy;
    import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy;
    
    @Configuration
    @EnableWebSecurity
    @ComponentScan(basePackageClasses = KeycloakSecurityComponents.class)
    public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
    
        @Autowired
        public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
            KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
            // 将Keycloak的角色映射为Spring Security的权限
            keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
            auth.authenticationProvider(keycloakAuthenticationProvider);
        }
    
        @Bean
        @Override
        protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
            // 注册会话认证策略
            return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
        }
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            super.configure(http);
            http.authorizeRequests()
              .antMatchers("/public/**").permitAll()
              .anyRequest().authenticated();
        }
    }
    

    在这个配置类中,configureGlobal方法配置了认证提供者,将 Keycloak 的角色映射为 Spring Security 的权限。sessionAuthenticationStrategy方法定义了会话认证策略,用于管理用户会话。configure方法则配置了哪些路径需要认证,哪些路径可以公开访问。

    三、Vue 与 Keycloak 无缝对接

    (一)安装 Keycloak JS 库

    在 Vue 项目根目录下,通过 npm 或 yarn 安装:

    npm install keycloak - js
    

    (二)构建 Keycloak 服务

    在 Vue 项目的src/services目录下创建keycloak.service.js文件:

    import Keycloak from 'keycloak-js';
    
    let keycloak = null;
    
    const initKeycloak = (onAuthenticatedCallback) => {
        const config = {
            url: 'http://your-keycloak-server/auth',
            realm:'mySpringAliRealm',
            clientId:'spring - vue - client'
        };
    
        keycloak = Keycloak(config);
    
        keycloak.init({ onLoad: 'login - required' }).then((authenticated) => {
            if (authenticated) {
                onAuthenticatedCallback();
            } else {
                console.error('Failed to initialize Keycloak');
            }
        }).catch((error) => {
            console.error('Keycloak initialization failed:', error);
        });
    };
    
    const login = () => {
        keycloak.login();
    };
    
    const logout = () => {
        keycloak.logout();
    };
    
    const getToken = () => {
        return keycloak.token;
    };
    
    export default {
        initKeycloak,
        login,
        logout,
        getToken
    };
    

    这个服务文件初始化了 Keycloak 实例,并提供了登录、登出和获取令牌的方法。initKeycloak方法在初始化时,根据配置连接到 Keycloak 服务器,并在认证成功后执行回调函数。

    (三)在 Vue 组件中集成

    在需要登录功能的 Vue 组件中,如Login.vue

    import keycloakService from '@/services/keycloak.service';
    
    export default {
        name: 'LoginComponent',
        created() {
            keycloakService.initKeycloak(() => {
                // 登录成功后的回调,可在此获取用户信息等
                const userInfo = keycloakService.keycloak.tokenParsed;
                console.log('User info:', userInfo);
            });
        },
        methods: {
            handleLogin() {
                keycloakService.login();
            }
        }
    }
    

    在组件创建时,调用initKeycloak方法初始化 Keycloak。当用户点击登录按钮时,调用handleLogin方法,触发 Keycloak 的登录流程。

    四、实现阿里云免登录重定向

    (一)获取阿里云重定向地址

    1. Keycloak 配置:在 Keycloak 管理控制台,进入 Realm,点击 “Clients”,找到为阿里云配置的 Client(假设为 “aliyun - client”)。在 “Client Scopes” 标签中,确保已关联正确的作用域。在 “Mappers” 标签中,添加或查看与阿里云集成相关的映射,如自定义的重定向 URL 映射。
    2. 获取地址:通过编写脚本或在 Spring Boot 应用中调用 Keycloak API,获取该 Client 配置的重定向地址。例如,使用 Keycloak 的 Java 客户端库:
    import org.keycloak.admin.client.Keycloak;
    import org.keycloak.admin.client.KeycloakBuilder;
    import org.keycloak.representations.idm.ClientRepresentation;
    
    public class KeycloakClient {
        public static void main(String[] args) {
            Keycloak keycloak = KeycloakBuilder.builder()
                  .serverUrl("http://your - keycloak - server/auth")
                  .realm("mySpringAliRealm")
                  .username("admin")
                  .password("admin")
                  .clientId("admin - cli")
                  .build();
    
            ClientRepresentation client = keycloak.realm("mySpringAliRealm").clients().findByClientId("aliyun - client").get(0);
            // 假设重定向地址存储在自定义属性中
            String aliyunRedirectUrl = client.getAttributes().get("aliyun - redirect - url").get(0);
            System.out.println("Aliyun Redirect URL: " + aliyunRedirectUrl);
            keycloak.close();
        }
    }
    

    将上述代码调整为在 Spring Boot 应用中合适的服务或控制器方法,以便在需要时获取地址。

    (二)Spring Boot 重定向处理

    在 Spring Boot 应用中,创建一个控制器方法来处理登录成功后的重定向:

    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.PostMapping;
    
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    @Controller
    public class LoginController {
    
        @PostMapping("/loginSuccess")
        public void loginSuccess(HttpServletResponse response) {
            // 获取阿里云重定向地址(假设从配置或其他地方获取)
            String aliyunRedirectUrl = "从配置或通过API获取的地址";
            try {
                response.sendRedirect(aliyunRedirectUrl);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    当用户在 Spring Boot 服务页面登录成功后,通过loginSuccess方法获取阿里云重定向地址,并使用HttpServletResponsesendRedirect方法进行重定向。

    (三)错误处理与调试

    1. Keycloak 配置错误:若无法连接到 Keycloak 服务器或认证失败,检查 Keycloak 配置文件中的地址、Realm 名称、Client ID 和 Secret 是否正确。在 Keycloak 管理控制台查看日志,路径为 “Manage” -> “View Logs”,查找与认证相关的错误信息。
    2. Spring Boot 集成问题:若 Spring Boot 应用启动失败或无法正确处理认证请求,检查依赖是否正确引入,安全配置类是否有语法错误。在 Spring Boot 应用的日志中查找org.keycloak相关的日志,如DEBUG级别的日志可提供更多认证过程的详细信息。
    3. Vue 集成问题:在 Vue 项目中,若 Keycloak 初始化失败,检查浏览器控制台日志,查看是否有网络错误或配置错误。确保keycloak - js库正确引入,并且初始化配置与 Keycloak 服务器一致。
    4. 重定向问题:若无法正确重定向到阿里云,检查获取的重定向地址是否正确,是否符合阿里云的安全要求。在 Spring Boot 应用中,设置日志级别为DEBUG,查看HttpServletResponse的重定向日志,确保重定向过程没有异常。

    博主,针对您提到的问题,【青云交】精心整理了上面的答案。我在思考和解答过程中花了不少心思,希望这个答案能切实帮到您。如果您觉得满意,还望您能采纳,也期待您能关注我,以后有其他问题,咱们也可以一起探讨~

    评论

报告相同问题?

问题事件

  • 系统已结题 1月21日
  • 修改了问题 1月16日
  • 赞助了问题酬金15元 1月13日
  • 创建了问题 1月13日