Обработка сеансов в Spring Boot с аутентификацией LDAP для некоторых пользователей и входом в API-интерфейс LinkedIn для других - PullRequest
0 голосов
/ 06 июля 2018

Я занимаюсь разработкой веб-приложения на основе Java для отделов кадров. Есть два типа пользователей: HR-специалисты и соискатели. Эксперты входят через LDAP-аутентификацию, а кандидаты - через LinkedIn API.

Как я могу настроить сеансы этих двух типов пользователей? Есть ли у Spring библиотека для этого? В настоящее время в моем проекте нет конфигурации сеанса, поэтому эксперт и заявитель могут одновременно войти в систему с одного компьютера.

Кроме того, мне нужно иметь возможность вносить изменения в файлы .html, а также в зависимости от того, какой тип пользователя вошел в систему за один раз. Например: «Применить!» кнопка должна быть видимой для пользователей, которые вошли в систему через LinkedIn, а кнопка «Просмотреть заявителей» должна быть видимой для экспертов, которые вошли в систему через LDAP. Если бы вы также могли рассказать мне о том, как Thymeleaf, Spring и метод обработки сессий, которые вы мне порекомендуете, работают вместе, это было бы здорово.

Моя аутентификация LDAP:

@EnableGlobalMethodSecurity
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.headers().frameOptions().disable();
        http.authorizeRequests().antMatchers("applicants**").fullyAuthenticated().and()
                .authorizeRequests().antMatchers("**/job/**/applicants").fullyAuthenticated().and()
                .formLogin().loginPage("/login").permitAll().and()
                .logout().permitAll();
        http.csrf().disable();
    }


    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .ldapAuthentication()
                .userDnPatterns("uid={0},ou=people")
                .groupSearchBase("ou=groups")
                .contextSource(contextSource())
                .passwordCompare()
                .passwordEncoder(new LdapShaPasswordEncoder())
                .passwordAttribute("userPassword");
    }

    @Bean
    public DefaultSpringSecurityContextSource contextSource() {
        return new DefaultSpringSecurityContextSource(Arrays.asList("ldap://localhost:8389/"), "dc=springframework,dc=org");
    }

}

Логин LinkedIn:

@RestController
@RequestMapping("/connect")
public class LinkedInController {

    public static boolean connected = false;
    public static Applicant applicant;

    private static final String API_KEY = "xxxx";
    private static final String SECRET_KEY = "xxxx";
    private static final String REDIRECT_URI = "http://localhost:8080/connect/done/";
    private static final String STATE = "xxxx";
    private static final String NETWORK_NAME = "LinkedIn";
    private static final String PROTECTED_RESOURCE_URL = "https://api.linkedin.com/v1/people/~:(%s)";
    private static final String RESOURCE_FIELDS = "id,firstName,lastName,emailAddress,maiden-name,headline," +
            "industry,summary,picture-url";

    private OAuth20Service service;
    private ApplicantService applicantService;

    @Autowired
    public LinkedInController(ApplicantService applicantService){
        this.applicantService = applicantService;
    }

    @GetMapping()
    public ModelAndView redirectToAuthorization (Model model) throws IOException, InterruptedException, ExecutionException {
        // Replace these with your client id and secret
        service = new ServiceBuilder(API_KEY)
                .apiSecret(SECRET_KEY)
                .scope("r_basicprofile r_emailaddress")
                .callback(REDIRECT_URI)
                .state(STATE)
                .build(LinkedInApi20.instance());
        final Scanner in = new Scanner(System.in);
        final String authorizationUrl = service.getAuthorizationUrl();
        System.out.println("Auth. link:" + authorizationUrl);
        return new ModelAndView(new RedirectView(authorizationUrl));
    }

    @GetMapping("/done")
    public ModelAndView getToken(@RequestParam("code") String code, @RequestParam("state") String state, Model model) throws IOException, InterruptedException, ExecutionException {
        if (state.equals(STATE)){
            connected = true;
            System.out.println("State correct.");
            final OAuth2AccessToken accessToken = service.getAccessToken(code);
            final OAuthRequest request = new OAuthRequest(Verb.GET, String.format(PROTECTED_RESOURCE_URL, RESOURCE_FIELDS));
            System.out.println(request.getUrl());
            request.addHeader("x-li-format", "json");
            request.addHeader("Accept-Language", "ru-RU");
            service.signRequest(accessToken, request);
            final Response response = service.execute(request);
            ObjectMapper mapper = new ObjectMapper();
            Applicant applicant = mapper.readValue(response.getBody(), Applicant.class);
            this.applicant = applicant;
            applicantService.persistNewApplicant(applicant);
        }
        model.addAttribute("success", LinkedInController.connected);
        model.addAttribute("applicant", LinkedInController.applicant);
        return new ModelAndView("connected.html");
    }


}

Я использую Spring Boot, IntelliJ, базу данных H2, LinkedIn API и LDAP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...