请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

使用Spring Boot和OAuth构建安全的SPA

[复制链接]
查看: 84|回复: 0

2万

主题

3万

帖子

8万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
81333
发表于 2020-1-14 14:13 | 显示全部楼层 |阅读模式
近来一段时候都在闭关进修,进程照旧有点吃力的,侥幸的是另有优锐课教员带着,少走了很多弯路。很久也没有更新文章了,这篇想和大家分享的是,了解若何在利用Spring Boot入门步伐的同时利用Spring Boot和OAuth构建平安的SPA,以获得对考证和权限映照的其他支持。
即使是最底子的JavaScript单页利用步伐(SPA),也很大要必要平安地从源利用步伐拜候资本,而且假如你是像我这样的Java开辟职员,则大如果Spring Boot利用步伐,而且你大要想利用OAuth 2.0隐式流。经过此流程,你的客户端将在每个请求中发送一个承载令牌,而且你的办事器端利用步伐将利用身份供给者(IdP)考证该令牌。
在本教程中,你将经过构建两个演示这些道理的小型利用步伐来了解有关隐式流程的更多信息:一个带有一点JQuery的简单SPA客户端利用步伐以及一个带有Spring Boot的后端办事。你将经过利用标准的Spring OAuth位起头,然后切换到Okta Spring Boot Starter并检查其增加的功用。前几节将与供给商无关,可是由于我并非一无所知,是以我将向你展现怎样利用Okta作为你的IdP。
建立一个Spring Boot利用步伐

假如你还没有实行过start.spring.io,请立即单击以举行检查……单击频频,它将为你供给一个底子的,可运转的Spring Boot利用步伐。
  1. 1 curl https://start.spring.io/starter.tgz \2  -d artifactId=oauth-implicit-example  \3  -d dependencies=security,web \4  -d language=java \5  -d type=maven-project \6  -d baseDir=oauth-implicit-example \7  | tar -xzvf -
复制代码

假如要从欣赏器下载项目,请转到:start.spring.io搜索并挑选“security”依存关系,然后单击绿色的“Generate Project”按钮。
解紧缩项目后,应当可以在命令行中启动它:./mvnw spring-boot:run。该利用步伐尚没法实行任何操纵,但这是一项“so far so good”的检查。用^C制止该进程,让我们起头现实编写代码!


写一些代码!

好吧,差不多。首先,将Spring OAuth 2.0依靠项增加到pom.xml中
  1. 1 2    org.springframework.security.oauth3    spring-security-oauth24    2.2.0.RELEASE5
复制代码

翻开DemoApplication.java,假如你依照(and you are right?),则应位于src/main/java/com/example/oauthimplicitexample中。不难发现,该项目仅包含两个Java类,其中一个是测试。
用@EnableResourceServer诠释该类,这将告诉Spring Security增加必要的过滤器和逻辑来处置惩罚OAuth隐式请求。
接下来,增加一个控制器:
  1. 1 @RestController2 public class MessageOfTheDayController {3    @GetMapping("/mod")4    public String getMessageOfTheDay(Principal principal) {5        return "The message of the day is boring for user: " + principal.getName();6    }7 }
复制代码

这就对了!底子上是Hello World。利用./mvnw spring-boot:run启动你的利用步伐备份。你应当可以拜候http://localhost:8080/mod
  1. 1 curl -v http://localhost:8080/mod2 HTTP/1.1 4013 Content-Type: application/json;charset=UTF-84 WWW-Authenticate: Bearer realm="oauth2-resource", error="unauthorized", error_description="Full authentication is required to access this resource"5 {6    "error": "unauthorized",7    "error_description": "Full authentication is required to access this resource"8 }
复制代码

401? 是的,默许情况下是平安的!此外,我们现实上并未供给OAuth IdP的任何设备具体信息。利用^C制止办事器,然后移至下一部分。


预备好你的OAuth信息

如上所述,你将继续利用Okta。你可以在https://developer.okta.com/上注册一个免费(永久)帐户。只需单击“注册”按钮并填写表格。完成此操纵后,你将获得两件事,即Okta底子URL,看起来像:dev-123456.oktapreview.com和一封有关怎样激活帐户的说明的电子邮件。
激活你的帐户,当你仍然在Okta开辟职员控制台中时,末端一步是:建立Okta SPA利用步伐。在顶部菜单栏上,单击“Applications”,然后单击“Add Application”。挑选SPA,然后单击Next
用以下值填写表格:
将其他全数内容保存为默许值,然后单击“Done”。下一页的底部是你的客户ID,你将鄙人一步中利用该ID。


为Spring设备OAuth

天生的示例利用步伐利用application.properties文件。我更喜好YAML,是以我将文件重命名为application.yml。
利用步伐资本办事器仅必要晓得怎样考证拜候令牌。由于OAuth 2.0或OIDC标准未界说拜候令牌的格式,是以可以远程考证令牌。The generated sample application uses
  1. 1 security:2  oauth2:3    resource:4      userInfoUri: https://dev-123456.oktapreview.com/oauth2/default/v1/userinfo
复制代码

此时,你可以启动利用步伐并起头考证拜候令牌!可是,固然,你将必要拜候令牌来举行考证…


建立登录页面

为方便起见,你将重用现有的Spring Boot利用步伐来托管SPA。凡是,这些资产可以托管在其他地方:另一个利用步伐,CDN等。出于本教程的方针,将一个孤独的index.html文件托管在另一个利用步伐中似乎有点过甚了。
建立一个新文件src/main/resources/static/index.html并用以下内容加添它:
  1.   1   2   3   4      5      6      7      8    Okta Implicit Spring-Boot  9     10     11     12     13     14     15     16  17  18  19
  2. 20  21
  3. 22  23 Logout 24 109 110
复制代码

此页面实行以下操纵:

  • 表示Okta登录小部件并获得拜候令牌
  • 挪用/sign-in-widget-config控制器来设备所述小部件(我们假定此文件由其他办事供给)
  • 用户登录后,页面将挪用/mod控制器(带有拜候令牌)并表示成果
为了支持我们的HTML,我们必要为/sign-in-widget-config端点建立一个新的Controller。
在与Spring Boot Application类类似的包中,建立一个新的SignInWidgetConfigControllerclass类:
  1. 1 @RestController 2 public class SignInWidgetConfigController { 3    private final String issuerUrl; 4    private final  String clientId; 5    public SignInWidgetConfigController(@Value("#{@environment['okta.oauth2.clientId']}") String clientId, 6                                        @Value("#{@environment['okta.oauth2.issuer']}")   String issuerUrl) { 7        Assert.notNull(clientId,  "Property 'okta.oauth2.clientId' is required."); 8        Assert.notNull(issuerUrl, "Property 'okta.oauth2.issuer' is required."); 9        this.clientId = clientId;10        this.issuerUrl = issuerUrl;11    }12    @GetMapping("/sign-in-widget-config")13    public WidgetConfig getWidgetConfig() {14        return new WidgetConfig(issuerUrl, clientId);15    }16    public static class WidgetConfig {17        public String baseUrl;18        public String clientId;19        public Map authParams = new LinkedHashMap();20        WidgetConfig(String issuer, String clientId) {21            this.clientId = clientId;22            this.authParams.put("issuer", issuer);23            this.baseUrl = issuer.replaceAll("/oauth2/.*", "");24        }25    }26 }
复制代码

将响应的设备增加到application.yml文件:
  1. 1 okta:2  oauth2:3    # Client ID from above step4    clientId: 00ICU81200ICU8125    issuer: https://dev-123456.oktapreview.com/oauth2/default
复制代码

末端一件事是答应公众拜候index.html页面和 /sign-in-widget-config
在你的利用步伐中界说ResourceServerConfigurerAdapter,以答应拜候这些资本。
  1. 1 @Bean 2 protected ResourceServerConfigurerAdapter resourceServerConfigurerAdapter() { 3    return new ResourceServerConfigurerAdapter() { 4        @Override 5        public void configure(HttpSecurity http) throws Exception { 6            http.authorizeRequests() 7                    .antMatchers("/", "/index.html", "/sign-in-widget-config").permitAll() 8                    .anyRequest().authenticated(); 9        }10    };11 }
复制代码

动起来!

利用./mvnw spring-boot:run再次启动你的利用步伐,然后欣赏至 http://localhost:8080/。你应当可以利用新的Okta帐户登录并检察当天的消息。
实行Okta Spring Boot Starter

到现在为止(登录页面除外),你不停在利用Spring Security OAuth 2.0的即用型支持。这样做是由于:标准!这类方式存在一些题目:

  • 对我们利用步伐的每个请求都必要不必要的往返回OAuth IdP
  • 我们不晓得建立拜候令牌时利用了哪些范围
  • 在这类情况下,用户的组/脚色不成用
这些大要对你的利用步伐来说大要不是题目,可是打点它们就像向你的POM文件增加另一个依靠项一样简单:
  1. 1 2    com.okta.spring3    okta-spring-boot-starter4    0.2.05
复制代码

假如必要,以致可以缩减application.yml文件,其中任何security.* 属性将优先于 okta.* 属性:
  1. 1 okta:2  oauth2:3    clientId: 00ICU81200ICU8124    issuer: https://dev-123456.oktapreview.com/oauth2/default
复制代码

重新启动你的利用步伐,已包揽理了前两个题目!
末端一个必要额外的步伐,你将不能不向Okta的拜候令牌增加额外的数据:
回到Okta Developer Console,在菜单拦亓击API > Authorization Server。在此示例中,我们不停在利用“default”授权办事器,是以请单击“edit”,然后挑选“Claims”标签。点击“Add Claim”,然后利用以下值填写表单:

  • Name: groups
  • Include in token type: Access Token
  • Value type: Groups
  • Filter: Regex - .*
将此外的保存为默许设备,然后点击“Create”。
okta-spring-boot-starter会自动将组声明中的值映照到Spring Security Authority。以标准的Spring Security方式,我们可以诠释我们的方式来设备拜候级别。
要启用@PreAuthorize表白,你必要将@EnableGlobalMethodSecurity增加到Spring Boot Application。假如还要考证OAuth范围,则必要增加OAuth2MethodSecurityExpressionHandler。只需将以下代码片断放入你的Spring Boot利用步伐即可。
  1. 1 @EnableGlobalMethodSecurity(prePostEnabled = true)2 protected static class GlobalSecurityConfiguration extends GlobalMethodSecurityConfiguration {3    @Override4    protected MethodSecurityExpressionHandler createExpressionHandler() {5        return new OAuth2MethodSecurityExpressionHandler();6    }7 }
复制代码

末端,利用@PreAuthorize更新MessageOfTheDayController(在这类情况下,你答应“全数人”或“电子邮件”范围内的任何人)。
  1. 1 @RestController2 public class MessageOfTheDayController {3    @GetMapping("/mod")4    @PreAuthorize("hasAuthority('Everyone') || #oauth2.hasScope('email')")5    public String getMessageOfTheDay(Principal principal) {6        return "The message of the day is boring for user: " + principal.getName();7    }8 }
复制代码

感激阅读~

免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 妈妈网-中国妈妈第一,是怀孕、育儿、健康等知识交流传播首选平台 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表