31 Mayıs 2020 Pazar

SpringSecurity OAuth2 AuthorizationServerConfigurerAdapter Sınıfı - Kendi OAuth2 Authorization Sunucumuz İçin

Giriş
Bu sınıf maintenance modda.@EnableAuthorizationServer yazısına bakabilirsiniz.

Daha derli doplu bir yazı için Authorization Code Grant yazısına bakabilirsiniz

Örnek
Şöyle yaparız.
@Configuration
@EnableAuthorizationServer
protected static class AuthorizationServerConfiguration extends
  AuthorizationServerConfigurerAdapter {

  @Autowired
  private AuthenticationManager authenticationManager;

  @Autowired
  private UserDetailsService userDetailsService;

  @Autowired
  private PasswordEncoder passwordEncoder;

  @Autowired
  private TokenStore tokenStore;

  @Autowired
  private SecurityConfiguration securityConfiguration;
  ...
  
}
Bu sınıfın 3 temel metodu var

configure metodu - AuthorizationServerSecurityConfigurer
İmzası şöyle. Bu metod'da hep aynı şey yapılıyor.
@Override
public void configure(AuthorizationServerSecurityConfigurer security) throws Exception;
Örnek
Şöyle yaparız.
@Override
public void configure(AuthorizationServerSecurityConfigurer security) {
  security.tokenKeyAccess("permitAll()")
    .checkTokenAccess("isAuthenticated()");
}
Örnek
Eğer kullanıcı bilgisi şifreli gelsin istersek şöyle yaparız. PasswordEncoder olarak örneğin BCryptPasswordEncoder kullanılabilir
@Override
public void configure(AuthorizationServerSecurityConfigurer security) {
  security.tokenKeyAccess("permitAll()")
    .checkTokenAccess("isAuthenticated()")
    .passwordEncoder(this.passwordEncoder);
}
Örnek
Şöyle yaparız
@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer){
  oauthServer
    .tokenKeyAccess("permitAll()")
    .checkTokenAccess("permitAll()")
    .passwordEncoder(passwordEncoder)
    .allowFormAuthenticationForClients();
}
configure - ClientDetailsServiceConfigurer - Kullanıcı Bilgileri
İmzası şöyle. Kullanıcı bilgileri ve token ile ilgili ayarlar burada yapılır.
@Override
 public void configure(ClientDetailsServiceConfigurer clients) throws Exception;
authorizedGrantTypes "authorization_code""client-credentials", "password","refresh_token" seçeneklerini alabilir.
Açıklama şöyle
grant_type means the client can get access_token by client username and password or refresh_token.
Örnek
Şöyle yaparız. Burada authorizedGrantTypes() metoduna "password" geçildiği için client şifresini gönderip token alabilir.
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
  clients.inMemory().withClient("client")
    .secret(passwordEncoder.encode(("secret")))
    .authorizedGrantTypes("password")
    .scopes("webclient","mobileclient");
}
Örnek
Şöyle yaparız. Burada authorizedGrantTypes() metoduna "password" ve "refresh_token" geçildiği için client şifresini gönderip token alabilir. Token'ı yenileyebilir.
clients.inMemory()
  .withClient(...)
  .authorizedGrantTypes("password", "refresh_token")
  .scopes("mobile_app")
  .resourceIds(...)
  .accessTokenValiditySeconds(...)
  .refreshTokenValiditySeconds(...)
  .secret(...);
Örnek
Şöyle yaparız
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
  //IN-memory authentication configuration
  clients.inMemory()
      .withClient("web-portal")
      .authorizedGrantTypes("password", "authorization_code", "refresh_token", "implicit")
      .scopes("ui")
      .autoApprove(true)
      .secret(passwordEncoder.encode("password"))
      .redirectUris("http://localhost:8093/socialDiagnostica/login/oauth2/code/")
    .and()
      withClient("mobile-app")
      authorizedGrantTypes("client_credentials", "refresh_token", "password")
      scopes("ui")
      .autoApprove(true)
      .secret(passwordEncoder.encode("password"))
    .and()
      .withClient("social-diagnostica-service")
      .secret(passwordEncoder.encode("password"))
      .authorizedGrantTypes("client_credentials", "refresh_token")
      .scopes("server")
      .autoApprove(true);
//clients.jdbc(dataSource);
}
configure - AuthorizationServerEndpointsConfigurer - TokenStore ve AuthenticationManager Ayarları
Authorization için kullanılack endpoint'lerin ayarlarını yapabilmeyi sağlar.

28 Mayıs 2020 Perşembe

SpringAOP ProxyFactory Sınıfı - Dynamic Proxy Yaratır

Giriş
Şu satırı dahil ederiz.
import org.springframework.aop.framework.ProxyFactory;
constructor - Pojo
Şöyle yaparız.
public static void main(String[] args) {
  ProxyFactory factory = new ProxyFactory(new SimplePojo());
  factory.addInterface(Pojo.class);
  factory.addAdvice(new RetryAdvice());

  Pojo pojo = (Pojo) factory.getProxy();
  // this is a method call on the proxy!
  pojo.foo();
}
setTarget metodu - Pojo
Şöyle yaparız. SecureMessage sınıfı Pojo'dur. SecurityAdvice ise advice sınıfıdır
private static SecureBean getSecureBean() {

  SecureMessage target = new SecureMessage();
  SecurityAdvice advice = new SecurityAdvice();

  ProxyFactory factory = new ProxyFactory();
  factory.setTarget(target);
  factory.addAdvice(advice);
  SecureMessage proxy = (SecureMessage) factory.getProxy();

  return proxy;

}

SpringAOP @After Anotasyonu

Giriş
Örnek ver

SpringAOP Kavramları

Kavramların Açıklamaları

Pointcut
@Pointcut Anotasyonu yazısına taşıdım. Pointcut, Advice'ın hangi metodlara uygulanacağını belirtir.

Advice
Açıklaması şöyle. Çalıştırılmasını istediğimiz kodu temsil eder.
An advice is the logic that you want to invoke when you intercept a method.
3 çeşit Advice vardır. Açıklaması şöyle
Different types of advice include “around,” “before” and “after” advice.
Aspect
Açıklaması şöyle. Aspect sınıfı Pointcut ve Advice'ı tanımlar. Pointcut Advice'ın hangi metodlara uygulanacağını belirtir. Advice ne iş yapılacağını belirtir.
A combination of defining when you want to intercept a method call (Pointcut) and what to do (Advice) is called an Aspect.
Join Point
Açıklaması şöyle.
When the code is executed and the condition for pointcut is met, the advice is executed. The Join Point is a specific execution instance of an advice.
Weaver
Açıklaması şöyle.
Weaver is the framework that implements AOP — AspectJ or Spring AOP.