{"id":20215620,"url":"https://github.com/casdoor/casdoor-springcloud-gateway-example","last_synced_at":"2025-10-18T09:34:49.403Z","repository":{"id":104354405,"uuid":"526654583","full_name":"casdoor/casdoor-springcloud-gateway-example","owner":"casdoor","description":"Spring Cloud Gateway example for Casdoor","archived":false,"fork":false,"pushed_at":"2023-08-08T05:15:18.000Z","size":464,"stargazers_count":4,"open_issues_count":0,"forks_count":5,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-24T13:11:12.241Z","etag":null,"topics":["auth","authentication","authn","casdoor","iam","spring","spring-boot","spring-cloud","springboot","sso"],"latest_commit_sha":null,"homepage":"https://github.com/casdoor/casdoor","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/casdoor.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2022-08-19T15:14:51.000Z","updated_at":"2023-08-25T09:47:16.000Z","dependencies_parsed_at":null,"dependency_job_id":"7db0d85d-e022-46aa-a7bb-3b5624897f9a","html_url":"https://github.com/casdoor/casdoor-springcloud-gateway-example","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/casdoor%2Fcasdoor-springcloud-gateway-example","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/casdoor%2Fcasdoor-springcloud-gateway-example/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/casdoor%2Fcasdoor-springcloud-gateway-example/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/casdoor%2Fcasdoor-springcloud-gateway-example/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/casdoor","download_url":"https://codeload.github.com/casdoor/casdoor-springcloud-gateway-example/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248233989,"owners_count":21069493,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["auth","authentication","authn","casdoor","iam","spring","spring-boot","spring-cloud","springboot","sso"],"created_at":"2024-11-14T06:23:39.533Z","updated_at":"2025-10-18T09:34:44.365Z","avatar_url":"https://github.com/casdoor.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# casdoor-springcloud-gateway-example\n\nThis is an example on how to use `casdoor-spring-boot-starter` as a OAuth2 plugin in Spring Cloud Gateway. We will show\nyou the steps below.\n\n## What you need\n\nThe Casdoor should be deployed.\n\nYou can refer to the Casdoor official documentation for\nthe [install guide](https://casdoor.org/docs/basic/server-installation). Please deploy your Casdoor instance in **\nproduction mode**.\n\nAfter a successful deployment, you need to ensure:\n\n- Open your favorite browser and visit **http://localhost:8000**, you will see the login page of Casdoor.\n- Input `admin` and `123` to test login functionality is working fine.\n\n## Quickstart\n\n### Step1: Init a Spring Cloud Gateway\n\nYou can use the code of this example directly or combine your own business code.\n\nWe need a gateway service and at least one business service.\n\nIn this example, `casdoor-gateway` as the gateway service and `casdoor-api` as the business service.\n\n### Step2: Include the dependency\n\nAdd ```casdoor-spring-boot-starter``` to the Spring Cloud Gateway project.\n\nFor Apache Maven:\n\n```Maven\n\u003c!-- https://mvnrepository.com/artifact/org.casbin/casdoor-spring-boot-starter --\u003e\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.casbin\u003c/groupId\u003e\n    \u003cartifactId\u003ecasdoor-spring-boot-starter\u003c/artifactId\u003e\n    \u003cversion\u003e1.x.y\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\nFor Gradle:\n\n```gradle\n// https://mvnrepository.com/artifact/org.casbin/casdoor-spring-boot-starter\nimplementation group: 'org.casbin', name: 'casdoor-spring-boot-starter', version: '1.x.y'\n```\n\n### Step3: Configure your properties\n\nInitialization requires 6 parameters, which are all string type.\n\n| Name (in order)  | Must | Description                                         |\n|------------------|------|-----------------------------------------------------|\n| endpoint         | Yes  | Casdoor Server Url, such as `http://localhost:8000` |\n| clientId         | Yes  | Application.client_id                               |\n| clientSecret     | Yes  | Application.client_secret                           |\n| certificate      | Yes  | Application.certificate                             |\n| organizationName | Yes  | Application.organization                            |\n| applicationName  | No   | Application.name                                    |\n\nYou can use Java properties or YAML files to init as below.\n\nFor properties:\n\n```properties\ncasdoor.endpoint=http://localhost:8000\ncasdoor.clientId=\u003cclient-id\u003e\ncasdoor.clientSecret=\u003cclient-secret\u003e\ncasdoor.certificate=\u003ccertificate\u003e\ncasdoor.organizationName=built-in\ncasdoor.applicationName=app-built-in\n```\n\nFor yaml:\n\n```yaml\ncasdoor:\n  endpoint: http://localhost:8000\n  client-id: \u003cclient-id\u003e\n  client-secret: \u003cclient-secret\u003e\n  certificate: \u003ccertificate\u003e\n  organization-name: built-in\n  application-name: app-built-in\n```\n\nIn addition, you need to configure Gateway Routing. For yaml:\n\n```yaml\nspring:\n  application:\n    name: casdoor-gateway\n  cloud:\n    gateway:\n      routes:\n        - id: api-route\n          uri: http://localhost:9091\n          predicates:\n            - Path=/api/**\n```\n\n### Step4: Add the CasdoorAuthFilter\n\nAdd an implementation class of GlobalFilter to the gateway for identity verification, such as CasdoorAuthFilter in this\nexample.\n\nIf the authentication fails, it returns to the front end 401 to jump to the login interface.\n\n```java\n@Component\npublic class CasdoorAuthFilter implements GlobalFilter, Ordered {\n\n    private static final Logger LOGGER = LoggerFactory.getLogger(CasdoorAuthFilter.class);\n\n    @Override public int getOrder() {\n        return 0;\n    }\n\n    @Override public Mono\u003cVoid\u003e filter(ServerWebExchange exchange, GatewayFilterChain chain) {\n        return exchange.getSession().flatMap(webSession -\u003e {\n            CasdoorUser user = webSession.getAttribute(\"casdoorUser\");\n            if (user != null) {\n                return chain.filter(exchange);\n            }\n            ServerHttpResponse response = exchange.getResponse();\n            response.setStatusCode(HttpStatus.UNAUTHORIZED);\n            response.getHeaders().add(\"Content-Type\", \"application/json\");\n            return response.setComplete();\n        });\n    }\n}\n```\n\n### Step5: Get the Service and use\n\nNow provide 5 services: `CasdoorAuthService`, `CasdoorUserService`, `CasdoorEmailService`, `CasdoorSmsService`\nand `CasdoorResourceService`.\n\nYou can create them as below in Gateway project.\n\n```java\n@Resource\nprivate CasdoorAuthService casdoorAuthService;\n```\n\nWhen you need the authentication who access your app, you can send the target url and redirect to the login page\nprovided by Casdoor.\n\nPlease be sure that you have added the callback url (e.g. http://localhost:9090/callback) in application configuration\nin advance.\n\n```java\n@RequestMapping(\"login\")\npublic Mono\u003cString\u003e login() {\n    return Mono.just(\"redirect:\" + casdoorAuthService.getSigninUrl(\"http://localhost:9090/callback\"));\n}\n```\n\nAfter Casdoor verification passed, it will be redirected to your application with code and state.\n\nYou can get the code and call `getOAuthToken` method, then parse out jwt token.\n\n`CasdoorUser` contains the basic information about the user provided by Casdoor, you can use it as a keyword to set the\nsession in your application.\n\n```java\n@RequestMapping(\"callback\")\npublic Mono\u003cString\u003e callback(String code,String state,ServerWebExchange exchange) {\n    String token = \"\";\n    CasdoorUser user = null;\n    try {\n        token = casdoorAuthService.getOAuthToken(code,state);\n        user = casdoorAuthService.parseJwtToken(token);\n    } catch(CasdoorAuthException e) {\n    \te.printStackTrace();\n    }\n    CasdoorUser finalUser = user;\n    return exchange.getSession().flatMap(session -\u003e {\n        session.getAttributes().put(\"casdoorUser\", finalUser);\n        return Mono.just(\"redirect:/\");\n    });\n}\n```\n\nExamples of APIs are shown below.\n\n- CasdoorAuthService\n    - `String token = casdoorAuthService.getOAuthToken(code, \"app-built-in\");`\n    - `CasdoorUser casdoorUser = casdoorAuthService.parseJwtToken(token);`\n- CasdoorUserService\n    - `CasdoorUser casdoorUser = casdoorUserService.getUser(\"admin\");`\n    - `CasdoorUser casdoorUser = casdoorUserService.getUserByEmail(\"admin@example.com\");`\n    - `CasdoorUser[] casdoorUsers = casdoorUserService.getUsers();`\n    - `CasdoorUser[] casdoorUsers = casdoorUserService.getSortedUsers(\"created_time\", 5);`\n    - `int count = casdoorUserService.getUserCount(\"0\");`\n    - `CasdoorResponse response = casdoorUserService.addUser(user);`\n    - `CasdoorResponse response = casdoorUserService.updateUser(user);`\n    - `CasdoorResponse response = casdoorUserService.deleteUser(user);`\n- CasdoorEmailService\n    - `CasdoorResponse response = casdoorEmailService.sendEmail(title, content, sender, receiver);`\n- CasdoorSmsService\n    - `CasdoorResponse response = casdoorSmsService.sendSms(randomCode(), receiver);`\n- CasdoorResourceService\n    - `CasdoorResponse response = casdoorResourceService.uploadResource(user, tag, parent, fullFilePath, file);`\n    - `CasdoorResponse response = casdoorResourceService.deleteResource(file.getName());`\n\n### Step6: Restart project\n\nAfter start, open your favorite browser and visit **http://localhost:9090**, then click any button which can request resources from `casdoor-api`.\n\n\u003cimg src=\"./assets/index.png\" alt=\"index\" style=\"zoom:100%;\" /\u003e\n\nThe gateway authentication logic will be triggered. Since you are not logged in, you will jump to the login interface. Click Login Button.\n\n![toLogin](./assets/toLogin.png)\n\nYou can see the unified login platform of Casdoor.\n\n\u003cimg src=\"./assets/login.png\" alt=\"login\" style=\"zoom:50%;\" /\u003e\n\nAfter successful login, it will jump to the main interface. Then you can click any button.\n\n\u003cimg src=\"./assets/index-ok.png\" alt=\"index-ok\" style=\"zoom:95%;\" /\u003e\n\n## What's more\n\nYou can explore the following projects/docs to learn more about the integration of Java with Casdoor.\n\n- [casdoor-java-sdk](https://github.com/casdoor/casdoor-java-sdk)\n- [casdoor-spring-boot-starter](https://github.com/casdoor/casdoor-spring-boot-starter)\n- [casdoor-spring-boot-security-example](https://casdoor.org/docs/category/spring-security)\n- [casdoor-spring-boot-shiro-example](https://github.com/casdoor/casdoor-spring-boot-shiro-example)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcasdoor%2Fcasdoor-springcloud-gateway-example","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcasdoor%2Fcasdoor-springcloud-gateway-example","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcasdoor%2Fcasdoor-springcloud-gateway-example/lists"}