この記事は chillSAP 夏の自由研究2022 8/8の記事として執筆しています
はじめに
SAP BTP上でUI5のApplicationを作成時、DBへの登録処理等でサーバサイドのアプリケーションの開発も必要になることが多いかと思います。特にJavaのアプリケーションを開発する際に便利なSAP Cloud SDK等、Javaのライブラリについて一部紹介させていただきます。
ログインユーザの情報を取得
IAS(Identity Authentication Service) でユーザ管理をし、IAS上で管理されているユーザID、メールアドレス、従業員番号等を
サーバサイドのJavaアプリケーションで取得する場合に、com.sap.cloud.security.xsuaaのライブラリを使用し、Tokenから情報を取得することができます。
pom.xmlへの記載例
<dependency>
<groupId>com.sap.cloud.security.xsuaa</groupId>
<artifactId>xsuaa-spring-boot-starter</artifactId>
<version>2.13.0</version>
</dependency>
で対象のライブラリを読み込むことで使用が可能
WebSecurityConfigurerAdapterを拡張したクラスを作成し、xs-security.jsonと合わせてAPI単位に権限を設定することも可能
WebSecurityConfigurerAdapterの拡張例
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
XsuaaServiceConfiguration xsuaaServiceConfiguration;
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/hello-token/**").hasAuthority("Read") // checks whether it has scope "<xsappId>.Read"
.antMatchers("/actuator/**").authenticated()
.anyRequest().denyAll()
.and()
.oauth2ResourceServer()
.jwt()
.jwtAuthenticationConverter(getJwtAuthoritiesConverter());
// @formatter:on
}
Converter<Jwt, AbstractAuthenticationToken> getJwtAuthoritiesConverter() {
TokenAuthenticationConverter converter = new TokenAuthenticationConverter(xsuaaServiceConfiguration);
converter.setLocalScopeAsAuthorities(true); // not applicable in case of multiple xsuaa bindings!
return converter;
}
}
従業員番号等、拡張属性については
- IASの設定画面でSAML Assertion Attributesで追加
- xs-security.jsonにattributesの追加
- SAP BTPのApplicationのSecurity設定にAttributesを追加
の手順を踏むことにより、Javaのアプリケーションで拡張属性を取得することができます。
※Tokenからメールアドレス等の取得メソッドは用意されていますが、拡張属性は
getXSUserAttributeで取得の必要があります。
Tokenより取得例
@GetMapping("/v1/api/UserInfo")
public ResponseEntity<UserInfo> responseEntity(@AuthenticationPrincipal Token token) throws TokenFlowException {
UserInfo res = new UserInfo();
res.setLogonName(token.getLogonName());
res.setGivenName(token.getGivenName());
res.setFamilyName(token.getFamilyName());
res.setEmail(token.getEmail());
res.setOrigin(token.getOrigin());
String[] employeeNumber = token.getXSUserAttribute("EmployeeNum");
return new ResponseEntity<>(res, HttpStatus.OK);
}
参考サイト
https://github.com/SAP/cloud-security-xsuaa-integration
https://qiita.com/tami/items/77f8cad68cfd6975c9c0
https://blogs.sap.com/2020/07/24/mapping-of-saml-attributes-with-xsuaa-jwt-in-cloud-foundry/
javaからdestinationに設定したURLへの呼び出し
UI5等のフロント側からdestinationに設定したoDataサービス等を呼び出すことは多いので、サンプルコード等は良く目にしますが、今回はサーバサイドのアプリケーションからdestinationに設定したoDataサービス等を呼び出す方法を紹介します。
事例として、SuccessFactorsに保持したデータをバッチ処理でHANA DBへインポート処理や、バックエンドでFormsByAdobeを用いたPDF生成に使いました。
利点
- 認証設定のID/PWをJavaの設定に保持する必要がなくなる
- 認証処理をdestinationに任せることができる
- SAP SuccessFactors Extensibility作成時に自動的に作成されたdestinationを使用可能
pom.xmlへの記載例
<dependency>
<groupId>com.sap.cloud.sdk.cloudplatform</groupId>
<artifactId>scp-cf</artifactId>
<version>3.40.0</version>
</dependency>
Javaのコード例
DestinationLoader destinationLoader = new ScpCfDestinationLoader(Duration.ofSeconds(10));
HttpDestination destination = destinationLoader.tryGetDestination("hoge").get().asHttp();
HttpGet getRequest = new HttpGet(destination.getUri().toString() + "v1/forms/" + formTemplate);
HttpResponse httpResponse = httpClient.execute(getRequest);
その他
その他にもAlertNotificationServiceへ簡単にアクセスするライブラリや、Application Logging Serviceで表示されるLogViewerのlevelやlogger、msg等もきれいに出すためのライブラリも存在します。
他にも、SAP Cloud SDKの中には多くの機能が存在します。要件に直接必要な機能でないかもしれませんが、UATを始めとするテストフェーズでこれらのライブラリを導入することにより、不具合のトレースがしやすくなります。
終わりに
今回はchillSAP 夏の自由研究2022ということでライブラリの紹介を載せましたが、使い方の詳細などはまた詳しく投稿していきたいと思います。
参考サイト
https://sap.github.io/cloud-sdk/docs/overview/getting-started