JavaRush /Блоги Java /Random-TG /Биёед бо истифода аз мисоли хидмати қайдҳо тавассути почт...

Биёед бо истифода аз мисоли хидмати қайдҳо тавассути почтаи электронӣ ва OAuth2 ба Spring Security воридшавии мунтазамро ҷорӣ кунем

Дар гурӯҳ нашр шудааст
Ҳангоми навиштани аризаи худ, ман бо набудани мақолаҳои дақиқ дар бораи чӣ гуна ба корбар барои сабти ном тавассути почтаи электронӣ ва шабакаҳои иҷтимоӣ дучор шудам. Дарсҳои хуб оид ба таъсиси шакли классикии воридшавӣ вуҷуд доштанд. Дар OAuth2 дарсҳои хуб мавҷуданд . Дар бораи чӣ гуна якҷоя кардани ин ду усул маълумоти ҷиноӣ кам буд. Дар рафти чустучУ мо муяссар шудем, ки як халли корношоямро пайдо кунем. Вай хакикати нихой буданашро даъво намекунад, балки вазифаи худро ичро мекунад. Дар ин мақола ман нишон медиҳам, ки чӣ гуна хидмати нигаҳдории ёддоштро бо конфигуратсияи шабеҳи Spring Security аз сифр татбиқ кардан мумкин аст. Биёед тавассути почтаи электронӣ ва OAuth2 воридшавии мунтазамро ба Spring Security бо истифода аз мисоли хидмати қайдҳо ҷорӣ кунем - 1Эзоҳ: хуб аст, ки агар хонанда ақаллан якчанд дарсҳои баҳорро аз назар гузаронад, зеро таваҷҷӯҳ танҳо ба бехатарии баҳор равона карда мешавад, бидуни тавзеҳи муфассали анборҳо, контроллерҳо ва ғайра. бузург бошад. Мундариҷа
  1. Эҷоди лоиҳа
  2. Эҷоди an objectҳо ва мантиқи барнома
    1. Субъектҳо
    2. Анборҳо
    3. Назоратчиён
    4. Саҳифаҳо
  3. Танзими бехатарии баҳор барои воридшавии классикӣ
    1. Танзимоти асосӣ SecurityConfig
    2. Воридшавӣ ба корбари фармоишӣ
    3. Биёед контроллерро такмил дихем
    4. Оғози
  4. Насб кардани OAuth2 бо истифода аз Google ҳамчун намуна дар Spring Security
    1. Танзимоти филтр ва application.properties
    2. Нуктаҳои барҷастаи сабти барнома бо Google Cloud Platform
    3. CustomUserInfoTokenServices
  5. Ифтитоҳи ниҳоии лоиҳа

Эҷоди лоиҳа

Мо ба start.spring.io меравем ва асоси лоиҳаро ташкил медиҳем:
  • Веб - кушодани барнома дар Tomcat дарунсохт, харитаҳои URL ва ғайра;
  • JPA - пайвастшавӣ ба пойгоҳи додаҳо;
  • Mustache як муҳаррики шаблонест, ки барои тавлиди саҳифаҳои веб истифода мешавад;
  • Амният - ҳифзи барнома. Ин мақола барои ҳамин офарида шудааст.
Архиви натиҷашударо зеркашӣ кунед ва онро дар ҷузвдони лозимӣ кушоед. Мо онро дар IDE оғоз мекунем. Шумо метавонед базаи маълумотро бо салоҳдиди худ интихоб кунед. Ман MySQL-ро ҳамчун пойгоҳи додаи лоиҳа истифода мебарам, бинобар ин ман вобастагии зеринро ба файли pom.xml дар блоки <dependencies> илова мекунам:
<dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>5.1.34</version>
</dependency>
Дар айни замон конфигуратсияи application.properties чунин аст:
spring.datasource.url=jdbc:mysql://localhost:3306/springsectut?createDatabaseIfNotExist=true&useSSL=false&autoReconnect=true&useLegacyDatetimeCode=false&serverTimezone=UTC&useUnicode=yes&characterEncoding=UTF-8
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=yourUsername
spring.datasource.password=yourPassword

spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update

spring.jpa.properties.connection.characterEncoding=utf-8
spring.jpa.properties.connection.CharSet=utf-8
spring.jpa.properties.connection.useUnicode=true

spring.mustache.expose-request-attributes=true

Эҷоди an objectҳо ва мантиқи барнома

Субъектҳо

Биёед бастаеро созем, entitiesки дар он an objectҳои пойгоҳи додаҳо ҷойгир карда шаванд. Корбарро синфе тавсиф мекунад User, ки интерфейсро амалӣ мекунад UserDetails, ки барои конфигуратсияи Spring Security лозим аст. Истифодабаранда ID, номи корбар (ин почтаи электронӣ), парол, ном, нақш, парчами фаъолият, номи ҳисоби Google ва почтаи электронӣ ( googleNameва googleUsername) хоҳад дошт.
@Entity
@Table(name = "user")
public class User implements UserDetails
{
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  private String username;
  private String password;
  private String name;
  private boolean active;
  private String googleName;
  private String googleUsername;

  @ElementCollection(targetClass = Role.class, fetch = FetchType.EAGER)
  @CollectionTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"))
  @Enumerated(EnumType.STRING)
  private Set<Role> roles;

    //Геттеры, сеттеры, toString(), equals(), hashcode(), имплементация UserDetails
}
Нақшҳои корбар барои танзими дастрасӣ дар Spring Security истифода мешаванд. Барномаи мо танҳо як нақшро истифода мебарад:
public enum Role implements GrantedAuthority
{
  USER;

  @Override
  public String getAuthority()
  {
     return name();
  }
}
Биёед синфи ёддоштро бо id, унвони қайд, бадани ёддошт ва идентификати корбаре, ки он ба он тааллуқ дорад, эҷод кунем:
@Entity
@Table(name = "note")
public class Note
{
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  private String title;
  private String note;
  private Long userId;

    //Геттеры, сеттеры, toString(), equals(), hashcode()
}

Анборҳо

Барои захира кардани an objectҳо дар пойгоҳи додаҳо, ба мо анборҳо лозиманд, ки ҳама корҳои ифлосро барои мо иҷро кунанд. Биёед бастаеро эҷод кунем , ки дар он мо интерфейсҳои аз интерфейс мерос гирифташударо reposэҷод мекунем . UserRepoNoteRepoJpaRepository<Entity, Id>
@Service
@Repository
public interface UserRepo extends JpaRepository<User, Long>
{}

@Service
@Repository
public interface NoteRepo extends JpaRepository<Note, Long>
{
  List<Note> findByUserId(Long userId);
}

Назоратчиён

Хидмати қайдҳои мо дорои саҳифаҳои зерин хоҳад буд:
  • Хона;
  • Бақайдгирӣ;
  • Даромадгоҳ;
  • Рӯйхати қайдҳои корбар.
Танҳо корбари ваколатдор бояд ба рӯйхати қайдҳо дастрасӣ дошта бошад. Саҳифаҳои боқимонда оммавӣ мебошанд. Биёед бастаеро эҷод кунем controllers, ки синферо дар бар IndexControllerмегирад, ки харитасозии муқаррарии саҳифаи асосӣ дорад. Синф RegistrationControllerбарои сабти номи корбар масъул аст. Пас аз харитасозӣ маълумотро аз форма мегирад, корбарро ба пойгоҳи додаҳо захира мекунад ва ба саҳифаи воридшавӣ равона мекунад. PasswordEncoderбаъдтар шарҳ дода мешавад. Он барои рамзгузории паролҳо истифода мешавад.
@Controller
public class RegistrationController
{
  @Autowired
  private UserRepo userRepo;

  @Autowired
  private PasswordEncoder passwordEncoder;

  @GetMapping("/registration")
  public String registration()
  {
     return "registration";
  }

  @PostMapping("/registration")
  public String addUser(String name, String username, String password)
  {
     User user = new User();
     user.setName(name);
     user.setUsername(username);
     user.setPassword(passwordEncoder.encode(password));
     user.setActive(true);
     user.setRoles(Collections.singleton(Role.USER));

     userRepo.save(user);

     return "redirect:/login";
  }
Назоратчие, ки барои саҳифаи рӯйхати ёддоштҳо масъул аст, айни замон дорои функсияҳои соддакардашуда мебошад, ки пас аз татбиқи Spring Security мураккабтар мешавад.
@Controller
public class NoteController
{
  @Autowired
  private NoteRepo noteRepo;

  @GetMapping("/notes")
  public String notes(Model model)
  {
     List<Note> notes = noteRepo.findAll();
     model.addAttribute("notes", notes);

     return "notes";
  }

  @PostMapping("/addnote")
  public String addNote(String title, String note)
  {
     Note newNote = new Note();
     newNote.setTitle(title);
     newNote.setNote(note);

     noteRepo.save(newNote);

     return "redirect:/notes";
  }
}
Мо барои саҳифаи воридшавӣ контроллер наменависем, зеро он аз ҷониби Spring Security истифода мешавад. Ба ҷои ин, мо ба конфигуратсияи махсус ниёз дорем. Мисли маъмулӣ, биёед бастаи дигар эҷод кунем, ба он занг занем configва синфро дар он ҷо ҷойгир кунем MvcConfig. Вақте ки мо конфигуратсияи Spring Security менависем, он медонад, ки ҳангоми истифодаи "/login" мо ба кадом саҳифа ишора мекунем.
@Configuration
public class MvcConfig implements WebMvcConfigurer
{
  public void addViewControllers(ViewControllerRegistry registry)
  {
     registry.addViewController("/login").setViewName("login");
     registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
  }
}

Саҳифаҳо

Ман барои сохтани саҳифаҳо муҳаррики қолаби Mustache -ро истифода мебарам . Шумо метавонед дигареро амалӣ кунед, ин муҳим нест. Барои маълумоти мета, ки дар ҳама саҳифаҳо истифода мешавад, файли meta.mustache сохта шудааст. Он инчунин Bootstrap-ро дар бар мегирад, то саҳифаҳои лоиҳаи моро зеботар кунанд. Саҳифаҳо дар директорияи "src/main/resources/templates" сохта мешаванд. Файлҳо мӯйлаби васеъ доранд. Ҷойгиркунии рамзи html мустақиман дар мақола он хеле калон мешавад, бинобар ин дар ин ҷо истиноди папкаи қолибҳо дар анбори GitHub лоиҳа аст .

Танзими бехатарии баҳор барои воридшавии классикӣ

Spring Security ба мо кӯмак мекунад, ки барнома ва захираҳои онро аз дастрасии беиҷозат муҳофизат кунем. Мо конфигуратсияи кории мухтасарро дар синфе, SecurityConfigки аз . мерос гирифта шудааст WebSecurityConfigurerAdapter, эҷод мекунем ва онро дар баста ҷойгир мекунем config. Биёед онро бо шарҳи @EnableWebSecurity қайд кунем, ки дастгирии Spring Security -ро фаъол мекунад ва шарҳи @Configuration, ки нишон медиҳад, ки ин синф дорои баъзе конфигуратсияҳо мебошад. Эзоҳ: pom.xml ба таври худкор конфигуратсияшуда versionи ҷузъи аслии Spring Boot 2.1.4.RELEASE-ро дар бар мегирад, ки Амниятро бо роҳи муқарраршуда амалӣ карда наметавонад. Барои пешгирӣ кардани ихтилофот дар лоиҳа тавсия дода мешавад, ки versionро ба 2.0.1.RELEASE иваз кунед.

Танзимоти асосӣ SecurityConfig

Конфигуратсияи мо қодир аст:
  1. Рамзгузорӣ кардани паролҳо бо истифода аз BCryptPasswordEncoder:

    @Autowired
    private PasswordEncoder passwordEncoder;
    
    @Bean
    PasswordEncoder passwordEncoder()
    {
      PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
      return passwordEncoder;
    }
  2. Бо истифода аз провайдери аутентификатсияи махсус навишташуда ворид шавед:

    @Autowired
    private AuthProvider authProvider;
    
    @Override
    protected void configure(AuthenticationManagerBuilder auth)
    {
      auth.authenticationProvider(authProvider);
    }
  3. Ба корбарони беном иҷозат диҳед, ки ба саҳифаи хонагӣ, бақайдгирӣ ва саҳифаҳои воридшавӣ дастрасӣ пайдо кунанд. Ҳама дархостҳои дигар бояд аз ҷониби корбарони воридшуда иҷро карда шаванд. Биёед "/login" -и қаблан тавсифшударо ҳамчун саҳифаи воридшавӣ таъин кунем. Агар воридшавӣ бомуваффақият анҷом дода шавад, корбар ба саҳифае бо рӯйхати ёддоштҳо бурда мешавад, агар хатогӣ вуҷуд дошта бошад, корбар дар саҳифаи воридшавӣ боқӣ мемонад. Пас аз бомуваффақият баромадан, корбар ба саҳифаи асосӣ бурда мешавад.

    @Override
    protected void configure(HttpSecurity http) throws Exception
    {
      http
            .authorizeRequests()
            .antMatchers("/resources/**", "/", "/login**", "/registration").permitAll()
            .anyRequest().authenticated()
            .and().formLogin().loginPage("/login")
            .defaultSuccessUrl("/notes").failureUrl("/login?error").permitAll()
            .and().logout().logoutSuccessUrl("/").permitAll();
    }

Воридшавӣ ба корбари фармоишӣ

Шахси худнависӣ AuthProviderба корбар имкон медиҳад, ки на танҳо тавассути почтаи электронӣ, балки бо номи корбар низ ворид шавад.
@Component
public class AuthProvider implements AuthenticationProvider
{
  @Autowired
  private UserService userService;

  @Autowired
  private PasswordEncoder passwordEncoder;

  public Authentication authenticate(Authentication authentication) throws AuthenticationException
  {
     String username = authentication.getName();
     String password = (String) authentication.getCredentials();

     User user = (User) userService.loadUserByUsername(username);

     if(user != null && (user.getUsername().equals(username) || user.getName().equals(username)))
     {
        if(!passwordEncoder.matches(password, user.getPassword()))
        {
           throw new BadCredentialsException("Wrong password");
        }

        Collection<? extends GrantedAuthority> authorities = user.getAuthorities();

        return new UsernamePasswordAuthenticationToken(user, password, authorities);
     }
     else
        throw new BadCredentialsException("Username not found");
  }

  public boolean supports(Class<?> arg)
  {
     return true;
  }
}
Тавре ки шумо мушоҳида кардаед, синфи UserServiceдар баста ҷойгиршуда барои боркунии корбар масъул аст services. Дар ҳолати мо, он корбарро на танҳо аз рӯи майдон username, ба монанди татбиқи дарунсохт, балки аз рӯи номи корбар, номи ҳисоби Google ва почтаи электронии ҳисоби Google ҷустуҷӯ мекунад. Ду усули охирин барои мо ҳангоми воридшавӣ тавассути OAuth2 муфид хоҳанд буд. Дар ин ҷо синф дар нусхаи кӯтоҳ дода мешавад.
@Service
public class UserService implements UserDetailsService
{
  @Autowired
  private UserRepo userRepo;

  @Override
  public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
  {
     User userFindByUsername = userRepo.findByUsername(username);
     //Остальные поиски

     if(userFindByUsername != null)
     {
        return userFindByUsername;
     }
     //Остальные проверки
     return null;
  }
}
Эзоҳ: фаромӯш накунед, ки усулҳои заруриро дар UserRepo!

Биёед контроллерро такмил дихем

Мо Spring Security-ро танзим кардем. Ҳоло вақти он аст, ки аз ин дар контролери қайдҳои худ истифода баред. Акнун ҳар як харитасозӣ як параметри асосии Принсипро қабул мекунад, ки ба воситаи он корбарро пайдо мекунад. Чаро ман наметавонам бевосита ба синф дохил шавам User? Пас аз он, вақте ки мо тавассути шабакаҳои иҷтимоӣ воридшавӣ менависем, аз сабаби номувофиқ будани намудҳои корбарон низоъ ба миён меояд. Мо пешакй чандирии заруриро таъмин мекунем. Рамзи контролери қайдҳои мо ҳоло чунин менамояд:
@GetMapping("/notes")
public String notes(Principal principal, Model model)
{
  User user = (User) userService.loadUserByUsername(principal.getName());
  List<Note> notes = noteRepo.findByUserId(user.getId());
  model.addAttribute("notes", notes);
  model.addAttribute("user", user);

  return "notes";
}

@PostMapping("/addnote")
public String addNote(Principal principal, String title, String note)
{
  User user = (User) userService.loadUserByUsername(principal.getName());

  Note newNote = new Note();
  newNote.setTitle(title);
  newNote.setNote(note);
  newNote.setUserId(user.getId());

  noteRepo.save(newNote);

  return "redirect:/notes";
}
Эзоҳ: лоиҳа дорои муҳофизати CSRF бо нобаёнӣ фаъол аст , бинобар ин ё онро барои худ ғайрифаъол кунед (http.csrf().disable()) ё ҳамчун муаллифи мақола фаромӯш накунед, ки майдони пинҳонро бо аломати csrf илова кунед. ба ҳама дархостҳои почта.

Оғози

Мо кӯшиш мекунем, ки лоиҳаро оғоз кунем.
Биёед тавассути почтаи электронӣ ва OAuth2 воридшавии мунтазамро ба Spring Security бо истифода аз мисоли хидмати қайдҳо ҷорӣ кунем - 1
Биёед бо истифода аз мисоли хидмати қайдҳо - 2 воридшавии мунтазамро тавассути почтаи электронӣ ва OAuth2 ба Spring Security ҷорӣ кунем
Мо мебинем, ки дар базаи маълумот корбари нав пайдо шудааст. Рамз рамзгузорӣ шудааст.
Биёед бо истифода аз мисоли хидмати қайдҳо - 3 воридшавии мунтазамро тавассути почтаи электронӣ ва OAuth2 ба Spring Security ҷорӣ кунем
Биёед бо истифода аз мисоли хидмати қайдҳо - 4 -ро тавассути почтаи электронӣ ва OAuth2 ба Spring Security ворид кунем
Биёед бо истифода аз мисоли хидмати қайдҳо - 5 воридшавии мунтазамро тавассути почтаи электронӣ ва OAuth2 ба Spring Security ҷорӣ кунем
Биёед бо истифода аз мисоли хидмати қайдҳо - 6 воридшавии мунтазамро тавассути почтаи электронӣ ва OAuth2 ба Spring Security ҷорӣ кунем
Қайдҳо дар базаи маълумот захира карда мешаванд.
Биёед бо истифода аз мисоли хидмати қайдҳо - 7 воридшавии мунтазамро тавассути почтаи электронӣ ва OAuth2 ба Spring Security ҷорӣ кунем
Мо мебинем, ки лоиҳа бомуваффақият оғоз ва амал мекунад. Барои хушбахтии комил ба мо танҳо қобorяти ворид шудан тавассути шабакаҳои иҷтимоӣ лозим аст. Хуб, биёед оғоз кунем!

Насб кардани OAuth2 бо истифода аз Google ҳамчун намуна дар Spring Security

Ҳангоми татбиқи OAuth2, ман ба ин дастури расмии Spring такя кардам . Барои дастгирии OAuth2, китобхонаи зеринро ба pom.xml илова кунед:
<dependency>
  <groupId>org.springframework.security.oauth.boot</groupId>
  <artifactId>spring-security-oauth2-autoconfigure</artifactId>
  <version>2.0.0.RELEASE</version>
</dependency>
Биёед конфигуратсияи амнияти Spring-и худро дар SecurityConfig. Аввалан, биёед шарҳи @EnableOAuth2Client -ро илова кунем. Он ба таври худкор он чизеро, ки ба шумо барои ворид шудан тавассути шабакаҳои иҷтимоӣ лозим аст, мебарорад.

Танзимоти филтр ва application.properties

Биёед OAuth2ClientContext-ро барои истифода дар конфигуратсияи амниятии худ ворид кунем.
@Autowired
private OAuth2ClientContext oAuth2ClientContext;
OAuth2ClientContext ҳангоми сохтани филтр, ки дархости воридшавии иҷтимоии корбарро тасдиқ мекунад, истифода мешавад. Филтр ба шарофати шарҳи @EnableOAuth2Client дастрас аст. Ба мо танҳо лозим аст, ки онро бо тартиби дуруст пеш аз филтри асосии Spring Security даъват кунем. Танҳо он вақт мо метавонем масирҳоро ҳангоми воридшавӣ бо OAuth2 дарёфт кунем. Барои ин, мо -ро истифода мебарем FilterRegistrationBean, ки дар он мо афзалияти филтри худро ба -100 муқаррар мекунем.
@Bean
public FilterRegistrationBean oAuth2ClientFilterRegistration(OAuth2ClientContextFilter oAuth2ClientContextFilter)
{
  FilterRegistrationBean registration = new FilterRegistrationBean();
  registration.setFilter(oAuth2ClientContextFilter);
  registration.setOrder(-100);
  return registration;
}

private Filter ssoFilter()
{
  OAuth2ClientAuthenticationProcessingFilter googleFilter = new OAuth2ClientAuthenticationProcessingFilter("/login/google");
  OAuth2RestTemplate googleTemplate = new OAuth2RestTemplate(google(), oAuth2ClientContext);
  googleFilter.setRestTemplate(googleTemplate);
  CustomUserInfoTokenServices tokenServices = new CustomUserInfoTokenServices(googleResource().getUserInfoUri(), google().getClientId());
  tokenServices.setRestTemplate(googleTemplate);
  googleFilter.setTokenServices(tokenServices);
  tokenServices.setUserRepo(userRepo);
  tokenServices.setPasswordEncoder(passwordEncoder);
  return googleFilter;
}
Шумо инчунин бояд ба функсияи конфигуратсия (HttpSecurity http) филтри нав илова кунед:
http.addFilterBefore(ssoFilter(), UsernamePasswordAuthenticationFilter.class);
Филтр инчунин бояд донад, ки муштарӣ тавассути Google сабти ном шудааст. Аннотацияи @ConfigurationProperties муайян мекунад, ки кадом хосиятҳои конфигуратсияро дар application.properties ҷустуҷӯ кардан лозим аст.
@Bean
@ConfigurationProperties("google.client")
public AuthorizationCodeResourceDetails google()
{
  return new AuthorizationCodeResourceDetails();
}
Барои анҷом додани аутентификатсия, шумо бояд нуқтаи ниҳоии маълумоти корбари Google-ро муайян кунед:
@Bean
@ConfigurationProperties("google.resource")
public ResourceServerProperties googleResource()
{
  return new ResourceServerProperties();
}
Замимаи худро дар Google Cloud Platform ба қайд гирифта , мо ба application.properties хосиятҳоро бо префиксҳои мувофиқ илова мекунем:
google.client.clientId=yourClientId
google.client.clientSecret=yourClientSecret
google.client.accessTokenUri=https://www.googleapis.com/oauth2/v4/token
google.client.userAuthorizationUri=https://accounts.google.com/o/oauth2/v2/auth
google.client.clientAuthenticationScheme=form
google.client.scope=openid,email,profile
google.resource.userInfoUri=https://www.googleapis.com/oauth2/v3/userinfo
google.resource.preferTokenInfo=true

Нуктаҳои барҷастаи сабти барнома бо Google Cloud Platform

Роҳ: APIҳо ва хидматҳо -> Маълумоти эътимодномаи OAuth Равзанаи дархости дастрасӣ:
  • Номи барнома: Шакли баҳори воридшавӣ ва дастури OAuth2
  • Суроғаи почтаи электронии дастгирӣ: почтаи электронии шумо
  • Доираи Google API: почтаи электронӣ, профил, openid
  • Доменҳои ваколатдор: me.org
  • Истинод ба саҳифаи асосии барнома: http://me.org:8080
  • Истинод ба сиёсати махфияти барнома: http://me.org:8080
  • Истинод ба шартҳои истифодаи барнома: http://me.org:8080
Маълумотнома:
  • Навъи: Барномаи веб
  • Сарлавҳа: Шакли баҳори воридшавӣ ва дастури OAuth2
  • Манбаъҳои иҷозатдодашудаи JavaScript: http://me.org, http://me.org:8080
  • Иҷозати URI-и масир: http://me.org:8080/login, http://me.org:8080/login/google
Эзоҳ: азбаски Google намехоҳад бо суроғаи localhost:8080 кор кунад, дар охир сатри "127.0.0.1 me.org" ё чизи шабеҳро ба файли C:\Windows\System32\drivers\etc\hosts илова кунед. Муҳим он аст, ки домен дар шакли классикӣ аст.

CustomUserInfoTokenServices

Оё шумо калимаи Фармоишро дар тавсифи функсияи филтр мушоҳида кардед? Синф CustomUserInfoTokenServices. Бале, мо синфи худро бо blackjack ва қобorяти захира кардани корбар дар пойгоҳи додаҳо эҷод хоҳем кард! Бо истифода аз миёнабурҳои клавиатураи Ctrl-N дар IntelliJ IDEA, шумо метавонед пайдо кунед ва бубинед, ки чӣ тавр UserInfoTokenServicesпешфарз иҷро мешавад. Биёед рамзи онро ба синфи навтаъсис нусхабардорӣ кунем CustomUserInfoTokenServices. Аксарияти онро бетағйир мондан мумкин аст. Пеш аз тағир додани мантиқи функсияҳо, биёед UserRepoва ҳамчун майдонҳои хусусии синф илова кунем PasswordEncoder. Биёед барои онҳо танзимкунанда эҷод кунем. Биёед @Autowired UserRepo userRepo -ро ба синфи SecurityConfig илова кунем. Мо ба он нигоҳ мекунем, ки чӣ тавр нишондиҳандаи хато дар усули эҷоди филтр нопадид мешавад ва мо хурсанд мешавем. Чаро @Autowired-ро мустақиман ба CustomUserInfoTokenServices татбиқ кардан мумкин нест? Азбаски ин синф вобастагӣ намебинад, зеро худи он бо ягон шарҳи баҳор қайд карда нашудааст ва конструктори он ҳангоми эълони филтр ба таври возеҳ сохта мешавад. Бинобар ин, механизми DI Spring дар бораи он намедонад. Агар мо @Autowired чизеро дар ин синф шарҳ диҳем, ҳангоми истифода NullPointerException мегирем. Аммо тавассути танзимкунандагони возеҳ ҳама чиз хеле хуб кор мекунад. Пас аз татбиқи ҷузъҳои зарурӣ, an objectи асосии таваҷҷӯҳ функсияи loadAuthentication мегардад, ки дар он Map<String, Object> бо маълумот дар бораи корбар гирифта мешавад. Маҳз дар ин лоиҳа ман нигоҳдории корбареро, ки тавассути шабакаи иҷтимоӣ ба пойгоҳи додаҳо ворид шудааст, амалӣ кардам. Азбаски мо ҳисоби Google-ро ҳамчун провайдери OAuth2 истифода мебарем, мо месанҷем, ки оё харита майдони "зер"-ро дар бар мегирад, ки барои Google хос аст. Агар он мавҷуд бошад, ин маънои онро дорад, ки маълумот дар бораи корбар дуруст гирифта шудааст. Мо корбари нав эҷод мекунем ва онро дар базаи маълумот захира мекунем.
@Override
public OAuth2Authentication loadAuthentication(String accessToken)
     throws AuthenticationException, InvalidTokenException
{
  Map<String, Object> map = getMap(this.userInfoEndpointUrl, accessToken);

  if(map.containsKey("sub"))
  {
     String googleName = (String) map.get("name");
     String googleUsername = (String) map.get("email");

     User user = userRepo.findByGoogleUsername(googleUsername);

     if(user == null)
     {
        user = new User();
        user.setActive(true);
        user.setRoles(Collections.singleton(Role.USER));
     }

     user.setName(googleName);
     user.setUsername(googleUsername);
     user.setGoogleName(googleName);
     user.setGoogleUsername(googleUsername);
     user.setPassword(passwordEncoder.encode("oauth2user"));

     userRepo.save(user);
  }

  if (map.containsKey("error"))
  {
     this.logger.debug("userinfo returned error: " + map.get("error"));
     throw new InvalidTokenException(accessToken);
  }
  return extractAuthentication(map);
}
Ҳангоми истифодаи якчанд провайдерҳо, шумо метавонед дар як CustomUserInfoTokenServices имконоти гуногунро муайян кунед ва синфҳои гуногуни хидматҳои шабеҳро дар усули эъломияи филтр сабт кунед. Акнун ҳам User ва ҳам OAuth2Authentication метавонанд ҳамчун Принсипал амал кунанд. Азбаски мо дар UserService боркунии корбарро тавассути маълумоти Google пешакӣ ба назар гирифтем, барнома барои ҳарду намуди корбарон кор хоҳад кард. Мо контролери саҳифаи асосии лоиҳаро тағир медиҳем, то корбаронеро, ки бо истифода аз OAuth2 ворид шудаанд, ба саҳифаи қайдҳо равона созад.
@GetMapping("/")
public String index(Principal principal)
{
  if(principal != null)
  {
     return "redirect:/notes";
  }
  return "index";
}

Ифтитоҳи ниҳоии лоиҳа

Пас аз тағироти ночизи косметикӣ ва илова кардани тугмаи баромадан, мо оғози ниҳоии лоиҳаро анҷом медиҳем.
Биёед бо истифода аз мисоли хидмати қайдҳо - 8 воридшавии мунтазамро тавассути почтаи электронӣ ва OAuth2 ба Spring Security ҷорӣ кунем
Биёед бо истифода аз мисоли хидмати қайдҳо - 9 воридшавии мунтазамро тавассути почтаи электронӣ ва OAuth2 ба Spring Security ҷорӣ кунем
Биёед бо истифода аз мисоли хидмати қайдҳо - 10 воридшавии мунтазамро тавассути почтаи электронӣ ва OAuth2 ба Spring Security ҷорӣ кунем
Биёед бо истифода аз мисоли хидмати қайдҳо - 11 воридшавии мунтазамро тавассути почтаи электронӣ ва OAuth2 ба Spring Security ҷорӣ кунем
Биёед бо истифода аз мисоли хидмати қайдҳо - 12 воридшавии мунтазамро тавассути почтаи электронӣ ва OAuth2 ба Spring Security ҷорӣ кунем
Биёед бо истифода аз мисоли хидмати қайдҳо - 13 воридшавии мунтазамро тавассути почтаи электронӣ ва OAuth2 ба Spring Security ҷорӣ кунем
Биёед бо истифода аз мисоли хидмати қайдҳо - 14 воридшавии мунтазамро тавассути почтаи электронӣ ва OAuth2 ба Spring Security ҷорӣ кунем
Биёед бо истифода аз мисоли хидмати қайдҳо - 15 тавассути почтаи электронӣ ва OAuth2 ба Spring Security воридшавии мунтазамро ҷорӣ кунем
Корбар ҳам тавассути шакли муқаррарӣ ва ҳам тавассути ҳисоби Google бомуваффақият ворид мешавад. Ин аст он чизе ки мо мехостем! Умедворам, ки ин мақола баъзе нуктаҳоро дар бораи сохтани веб-барнома, таъмини он бо Spring Security ва омезиши усулҳои гуногуни воридшавӣ равшан кардааст. Бо рамзи пурраи лоиҳа шумо метавонед
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION