当前位置: 首页 > 科技观察

对于单点登录,不要一直盯着cas-server,你也可以选择keycloak

时间:2023-03-15 08:28:42 科技观察

这里的ca不是Java并发包中的CAS。做过单点登录(SSO)的同学应该不会陌生。这玩意儿太老了,生态之大,现在想起来还心有余悸。一直以来,做单点登录,或多或少都要参考CAS,很头疼。当然我们还有一个选择:keycloak,jboss出品。jboss出品的东西都出奇的重,keycloak也不例外,涵盖了权限认证各种场景的功能。这也是可以理解的。鉴权毕竟是一件又脏又累的活,想要包装好也不是一件容易的事。这就导致了虽然keycloak提供了简单易用的控件后台,但是如果不了解一些认证概念的话就不好用。今天xjjdog就来一个quickstart来尝尝这个权威服务的滋味。首先,下载它的安装包。wget-chttps://downloads.jboss.org/keycloak/11.0.2/keycloak-11.0.2.zip执行bin目录下的./standalone.sh文件启动keycloak服务器。可以看到它正在监听9990端口。此时访问该链接不会有任何信息,因为还没有初始用户。就像盘古创造了世界,我们需要一个盘古。使用add-user.sh命令初始化用户。如果你初始化了admin,你需要先启用它。初始化完成后,可以在访问后台进行设置。KeycloakServer部署在8080端口,可以通过以下链接访问。http://127.0.0.1:8080/auth/1。创建领域要使用Keycloak,您需要先生成一个领域。Realm是域的意思,域中所有的用户和权限都是独立的。如果这些公司愿意,我可以把京东和淘宝的用户全部放在一台服务器上。上面的例子是为了说明Realm是一种隔离措施。将鼠标悬停在左上角,点击添加领域,进入创建页面。创建领域非常简单,只需提供一个名称即可。但不要太兴奋。作为一个全局配置,肯定有很多选择。不过这都是自定义增强使用,这里不做讨论。2.创建权限接下来,您将创建两个权限组。权限也比较好理解,就是一个字符串。我们创建两个权限ROLE_ADMIN和ROLE_USER。3.创建用户现在是创建用户的时候了。在Users选项卡中点击New,进入创建目录。这里我们创建一个名为xjjdog0的用户。用户也有很多选择。我们主要关注两个部分。一个是Credentials,可以更新和设置用户密码;另一个是RoleMappings,可以设置用户权限。这里就这么搞吧,把xjjdog0的密码设置为123456。注意,这里有一个小细节。如果我们更新用户的密码。在用户设置的主页上,会出现更新密码的字样。这意味着用户需要更新一次自己的密码才能真正使用它。如果不需要强制用户重新设置密码,可以将其删除。我们当然删除了它。4、创建client如果要在xjjdog字段进行权限认证,还需要获取一个clientid来标识自己。这里我们创建了一个名为xjjdemo的client,后面会带入token接口。5.测试token接口地址获取接口:ip:port/auth/realms/icp/protocol/openid-connect/token这里根据我们上面设置的地址信息,可以得到token的请求地址构造为:http://localhost:8080/auth/realms/xjjdog/protocol/openid-connect/token使用curl获取token。curl-XPOST-d'client_id=xjjdemo&grant_type=password&scope=openid&username=xjjdog0&password=123456'http://localhost:8080/auth/realms/xjjdog/protocol/openid-connect/token提供client_id,grant_type,username,password等参数,发送post请求后会返回一个json。{"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICItMXF4RW9NTU1ON29NM2NrZUhPaEowaFVZVGxQNThfMDNwMDYzV1hIVzQwIn0.eyJleHAiOjE2MDI2NTQ1NzMsImlhdCI6MTYwMjY1NDI3MywianRpIjoiMGQ1ZmZhNzgtZTQ5OS00MmFmLTgyMTUtNjgwODNiNjQ4ODRlIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F1dGgvcmVhbG1zL3hqamRvZyIsImF1ZCI6ImFjY291bnQiLCJzdWIiOiJjYWQ3NjNiMS01OTg3LTQzYTItOGQ4MC0yZDVlODY1ZGI3MTYiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJ4ampkZW1vIiwic2Vzc2lvbl9zdGF0ZSI6ImQxMWQzOWM2LTBhMzItNDNlYi1iYTIyLTg1MzdlZWE4MDcwNiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiLyoiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIlJPTEVfVVNFUiIsIm9mZmxpbmVfYWNjZXNzIiwiUk9MRV9BRE1JTiIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwicHJlZmVycmVkX3VzZXJuYW1lIjoieGpqZG9nMCJ9.DVX3VtSjq-hSsjEWqudKIcZhSpIuuDyalRx0epD93HMX8ap5z_7LpeITdb3aRv3AFIBQe8d80SsDZwUIj9NSobyMo8US4ZF4cLyHEYsp881-vJInnrQ-vbnxwShsx1r1S8NO7dV1CP-aD8b611JBtzxV-P6GPbiZH283BFMnKFHQ68aox0_VYEx3dq3PA53LyM8-_rCElrpyTHk1dUdC7OluPgLx390m9H0TV_2aR9ufXGA4e-xW5fmOFvAHGlg_t3BoDVAduQkoy_wYHA_NbP3uRIOcC0pgOonAsspT2lXA_xkPU8oIpPvBQzcV4eWivm1WV_y6K4kOvn0ZJtkFmA","expires_in":300,"refresh_expires_in":1800,"refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJjNGMwMzMzOC04MDU5LTRlNDItODYxMC1iYzkzMjNjZDY5NmIifQ.eyJleHAiOjE2MDI2NTYwNzMsImlhdCI6MTYwMjY1NDI3MywianRpIjoiNGE5ZjgxMGItMzc1ZC00OGRmLTg3YjYtN2UwODY4MmFhNDYxIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F1dGgvcmVhbG1zL3hqamRvZyIsImF1ZCI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hdXRoL3JlYWxtcy94ampkb2ciLCJzdWIiOiJjYWQ3NjNiMS01OTg3LTQzYTItOGQ4MC0yZDVlODY1ZGI3MTYiLCJ0eXAiOiJSZWZyZXNoIiwiYXpwIjoieGpqZGVtbyIsInNlc3Npb25fc3RhdGUiOiJkMTFkMzljNi0wYTMyLTQzZWItYmEyMi04NTM3ZWVhODA3MDYiLCJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIn0.mJYtSMQLgEDlzpX7_WC5pAF8s2DENZB1IBv20R2kZ8s","token_type":"bearer","id_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICItMXF4RW9NTU1ON29NM2NrZUhPaEowaFVZVGxQNThfMDNwMDYzV1hIVzQwIn0.eyJleHAiOjE2MDI2NTQ1NzMsImlhdCI6MTYwMjY1NDI3MywiYXV0aF90aW1lIjowLCJqdGkiOiJmN2VjYjJlNi1mYmRlLTQ2ZjItOWE1Mi00YTEyMjlkYzQ5YjIiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvYXV0aC9yZWFsbXMveGpqZG9nIiwiYXVkIjoieGpqZGVtbyIsInN1YiI6ImNhZDc2M2IxLTU5ODctNDNhMi04ZDgwLTJkNWU4NjVkYjcxNiIsInR5cCI6IklEIiwiYXpwIjoieGpqZGVtbyIsInNlc3Npb25fc3RhdGUiOiJkMTFkMzljNi0wYTMyLTQzZWItYmEyMi04NTM3ZWVhODA3MDYiLCJhdF9oYXNoIjoiM1h0eEhqTUQ5Q3FNdEwxcWFxTlFfZyIsImFjciI6IjEiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsInByZWZlcnJlZF91c2VybmFtZSI6InhqamRvZzAifQ.EvUbCmrylfwFL0rhyX36nnxFNRTvtYZAkPYtLv6r8CCbolRHwNJDJflu44BpLQBJGD4UNFkvfsz1BmU-mAw5soxS7eaupOm8LGkUm_qmgj-qtH0eGRi4FlUq4Tw3gx4lGoyR1zNlt1dkcAhjNtyXkhZWjcjDownLgFajNrUCOUiFw1XZwBDPlyy5AQ8d1Kkc5RIF6zhy4bkXKp_fakTNWJPr2-C1xYcEssGOv81FVUajszmItnWP4SnJvzER_njpmnjg_b1lPMng-zMx-R7zgQrx06JStO0IKUd8hXSSmudpw652whR31cCWbTBhfNB2RH_Rnfrau2047WZ36I8zmg","not-before-policy":0,"session_state":"d11d39c6-0a32-43eb-ba22-8537eea80706","scope":"openidemailprofile"}access_token和id_token比较眼熟,它用.划分三部分,貌似JWT格式是用工具解码的,果然是,所以瞬间涨了。可以看到用户信息的playload区还有很多内容,这个一种token在网络上传输,肯定很浪费,但是现在是21世纪,这种浪费是可以接受的,请求下面的地址验证userinfocurl-XPOST-d'access_token={上面的token}'http://localhost:8080/auth/realms/xjjdog/protocol/openid-connect/userinfo你会得到下面的话。{"sub":"cad763b1-5987-43a2-8d80-2d5e865db716","email_verified":false,"preferred_username":"xjjdog0"}End可以看到,keycloak使用的是无状态的token管理,其设计是基于基于更高级的OAuth2.0和JSONWebToken(JWT)规范。对于互联网应用,自然具有横向扩展的能力。keycloak集成到SpringBoot中非常简单,官方有这样的demo。keycloak的开发也很活跃,master分支刚刚提交了代码。总之,值得一试!