Checkpoint 4. Basic Auth, get login.

This commit is contained in:
Gnazarov 2025-02-20 12:57:53 +03:00
parent 83bc1b8e85
commit 010e862edc
10 changed files with 157 additions and 97 deletions

View File

@ -55,10 +55,10 @@
<artifactId>postgresql</artifactId> <artifactId>postgresql</artifactId>
</dependency> </dependency>
<!-- <dependency>--> <dependency>
<!-- <groupId>org.springframework.boot</groupId>--> <groupId>org.springframework.boot</groupId>
<!-- <artifactId>spring-boot-starter-security</artifactId>--> <artifactId>spring-boot-starter-security</artifactId>
<!-- </dependency>--> </dependency>
</dependencies> </dependencies>

View File

@ -1,40 +1,43 @@
//package com.example.nto.config; package com.example.nto.config;
//
//import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
//import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Bean;
//import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.context.annotation.Configuration;
//import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
//import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity;
//import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
//import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
//import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.core.userdetails.UserDetailsService;
//import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
// import org.springframework.security.crypto.password.PasswordEncoder;
//@Configuration
//@EnableWebSecurity @Configuration
//@RequiredArgsConstructor @EnableWebSecurity
//public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @RequiredArgsConstructor
// public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
// private final UserDetailsService userDetailsService;
// private final UserDetailsService userDetailsService;
// @Override
// protected void configure(HttpSecurity http) throws Exception { @Override
// http protected void configure(HttpSecurity http) throws Exception {
// .csrf().disable() http
// .authorizeRequests() .csrf().disable()
// .antMatchers("/api/employee/registration").hasAuthority("ROLE_ADMIN") .authorizeRequests()
// .anyRequest().authenticated() .antMatchers("/api/employee/registration").hasAuthority("ROLE_ADMIN")
// .and() .anyRequest().authenticated()
// .httpBasic() .and()
// .and() .httpBasic()
// } .and()
// .headers().frameOptions().disable();
// @Override }
// protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()); @Override
// } protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
// public PasswordEncoder passwordEncoder(){ }
// return new BCryptPasswordEncoder();
// } @Bean
//} public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
}

View File

@ -9,6 +9,7 @@ import com.example.nto.service.impl.EmployeeServiceImpl;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ -92,4 +93,9 @@ public class EmployeeController {
return ResponseEntity.status(HttpStatus.OK).body(service.createEmployee(dto)); return ResponseEntity.status(HttpStatus.OK).body(service.createEmployee(dto));
} }
@GetMapping("/login")
public ResponseEntity<EmployeeDTO> getLogin(Authentication authentication){
return ResponseEntity.status(HttpStatus.OK).body(service.findEmployeeDTOByUsername(authentication.getName()));
}
} }

View File

@ -1,14 +1,16 @@
package com.example.nto.entity; package com.example.nto.entity;
import lombok.Data; import lombok.Data;
//import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.GrantedAuthority;
import javax.persistence.*; import javax.persistence.*;
import java.util.List;
import java.util.Set;
@Data @Data
@Entity @Entity
@Table(name = "authorities") @Table(name = "authorities")
public class Authority {//implements GrantedAuthority { public class Authority implements GrantedAuthority {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
@ -17,4 +19,7 @@ public class Authority {//implements GrantedAuthority {
@Column(name = "authority") @Column(name = "authority")
private String authority; private String authority;
// @OneToMany(targetEntity = Employee.class, fetch = FetchType.EAGER, cascade = CascadeType.ALL)
// private List<Employee> employees;
} }

View File

@ -4,7 +4,7 @@ import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
//import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;
import javax.persistence.*; import javax.persistence.*;
import java.util.Set; import java.util.Set;
@ -15,7 +15,7 @@ import java.util.Set;
@AllArgsConstructor @AllArgsConstructor
@Entity @Entity
@Table(name="employee") @Table(name="employee")
public class Employee {//implements UserDetails { public class Employee implements UserDetails {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private long id; private long id;
@ -38,26 +38,32 @@ public class Employee {//implements UserDetails {
@Column(name="lastVisit") @Column(name="lastVisit")
private String lastVisit; private String lastVisit;
// @ManyToMany(fetch = FetchType.EAGER) @ManyToMany(fetch = FetchType.EAGER)
// private Set<Authority> authorities; // @JoinTable(name = "employee_authorities",
// joinColumns = @JoinColumn(name = "employee_id"),
// inverseJoinColumns = @JoinColumn(name = "authorities_id")
// )
private Set<Authority> authorities;
// @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
// @JoinTable(name = "Employee_AUTHORITIES")
// @Override @Override
// public boolean isAccountNonExpired() { public boolean isAccountNonExpired() {
// return true; return true;
// } }
//
// @Override @Override
// public boolean isAccountNonLocked() { public boolean isAccountNonLocked() {
// return true; return true;
// } }
//
// @Override @Override
// public boolean isCredentialsNonExpired() { public boolean isCredentialsNonExpired() {
// return true; return true;
// } }
//
// @Override @Override
// public boolean isEnabled() { public boolean isEnabled() {
// return true; return true;
// } }
} }

View File

@ -9,6 +9,7 @@ import com.example.nto.repository.EmployeeRepository;
import com.example.nto.service.EmployeeService; import com.example.nto.service.EmployeeService;
import com.example.nto.util.EmployeeMapper; import com.example.nto.util.EmployeeMapper;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ -17,7 +18,10 @@ import java.util.Optional;
@Service @Service
@AllArgsConstructor @AllArgsConstructor
public class EmployeeServiceImpl implements EmployeeService { public class EmployeeServiceImpl implements EmployeeService {
private EmployeeRepository repository; private EmployeeRepository repository;
private final PasswordEncoder passwordEncoder;
@Override @Override
public void updateLocalTime(Employee employee) { public void updateLocalTime(Employee employee) {
employee.setLastVisit(LocalDateTime.now().toString()); employee.setLastVisit(LocalDateTime.now().toString());
@ -30,6 +34,11 @@ public class EmployeeServiceImpl implements EmployeeService {
return repository.findEmployeeByUsername(login).orElseThrow(() -> new EmployeeNotFoundException("Employee with username "+login+" not found")); return repository.findEmployeeByUsername(login).orElseThrow(() -> new EmployeeNotFoundException("Employee with username "+login+" not found"));
} }
public EmployeeDTO findEmployeeDTOByUsername(String login) {
return EmployeeMapper.convertToDTO(repository.findEmployeeByUsername(login).orElseThrow(() -> new EmployeeNotFoundException("Employee with username "+login+" not found")));
}
@Override @Override
public EmployeeDTO createEmployee(RegisterDTO dto) { public EmployeeDTO createEmployee(RegisterDTO dto) {
@ -41,7 +50,10 @@ public class EmployeeServiceImpl implements EmployeeService {
Employee employee = new Employee(); Employee employee = new Employee();
employee.setName(dto.getName()); employee.setName(dto.getName());
employee.setUsername(dto.getUsername()); employee.setUsername(dto.getUsername());
employee.setPassword(dto.getPassword());
// Encoding password
employee.setPassword(passwordEncoder.encode(dto.getPassword()));
employee.setPhoto(dto.getPhoto()); employee.setPhoto(dto.getPhoto());
employee.setJobPos(dto.getJobPos()); employee.setJobPos(dto.getJobPos());
employee.setLastVisit(LocalDateTime.now().toString()); employee.setLastVisit(LocalDateTime.now().toString());

View File

@ -1,20 +1,20 @@
//package com.example.nto.service.impl; package com.example.nto.service.impl;
//
//import com.example.nto.repository.EmployeeRepository; import com.example.nto.repository.EmployeeRepository;
//import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
//import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;
//import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UserDetailsService;
//import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.core.userdetails.UsernameNotFoundException;
//import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
//
//@Service @Service
//@RequiredArgsConstructor @RequiredArgsConstructor
//public class UserDetailsServiceImpl implements UserDetailsService { public class UserDetailsServiceImpl implements UserDetailsService {
//
// private final EmployeeRepository employeeRepository; private final EmployeeRepository employeeRepository;
//
// @Override @Override
// public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException{ public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException{
// return employeeRepository.findEmployeeByUsername(s).get(); return employeeRepository.findEmployeeByUsername(s).get();
// } }
//} }

View File

@ -9,7 +9,9 @@ spring:
datasource: datasource:
url: jdbc:postgresql://localhost:5432/testdb url: jdbc:postgresql://localhost:5432/testdb
data: classpath:data.sql data: classpath:data.sql
schema: classpath:schema.sql
init:
schema-locations: classpath:schema.sql
username: "postgres" username: "postgres"
password: "MobileDev" password: "MobileDev"
@ -28,7 +30,7 @@ spring:
hibernate: hibernate:
#ddl-auto: none #ddl-auto: none
ddl-auto: create-drop ddl-auto: update
# Показываем запросы # Показываем запросы
show-sql: true show-sql: true

View File

@ -5,10 +5,11 @@ VALUES
INSERT INTO employee (id, username, password, name, photo, job_pos, last_visit) INSERT INTO employee (id, username, password, name, photo, job_pos, last_visit)
VALUES VALUES
(1, 'pivanov', 'employee', 'Иванов Петр Федорович', 'https://funnyducks.ru/upload/iblock/0cd/0cdeb7ec3ed6fddda0f90fccee05557d.jpg', 'Разработчик', '2024-02-12T08:30'), (1, 'pivanov', '$2a$12$oSvuYhIhHJtyw3Gp542S3.WI2aupaIQ5265ItMDvnTPopcLQudx9q', 'Иванов Петр Федорович', 'https://funnyducks.ru/upload/iblock/0cd/0cdeb7ec3ed6fddda0f90fccee05557d.jpg', 'Разработчик', '2024-02-12T08:30'),
(2, 'ipetrov', 'employee', 'Петров Иван Константинович', 'https://funnyducks.ru/upload/iblock/0cd/0cdeb7ec3ed6fddda0f90fccee05557d.jpg', 'Аналитик', '2024-02-13T08:35'), (2, 'ipetrov', '$2a$12$oSvuYhIhHJtyw3Gp542S3.WI2aupaIQ5265ItMDvnTPopcLQudx9q', 'Петров Иван Константинович', 'https://funnyducks.ru/upload/iblock/0cd/0cdeb7ec3ed6fddda0f90fccee05557d.jpg', 'Аналитик', '2024-02-13T08:35'),
(3, 'asemenov', 'employee', 'Семенов Анатолий Анатольевич', 'https://funnyducks.ru/upload/iblock/0cd/0cdeb7ec3ed6fddda0f90fccee05557d.jpg', 'Разработчик', '2024-02-13T08:31'), (3, 'asemenov', '$2a$12$oSvuYhIhHJtyw3Gp542S3.WI2aupaIQ5265ItMDvnTPopcLQudx9q', 'Семенов Анатолий Анатольевич', 'https://funnyducks.ru/upload/iblock/0cd/0cdeb7ec3ed6fddda0f90fccee05557d.jpg', 'Разработчик', '2024-02-13T08:31'),
(4, 'afedorov', 'employee', 'Федоров Александр Сергеевич', 'https://funnyducks.ru/upload/iblock/0cd/0cdeb7ec3ed6fddda0f90fccee05557d.jpg', 'Тестировщик', '2024-02-12T08:36'); (4, 'afedorov', '$2a$12$oSvuYhIhHJtyw3Gp542S3.WI2aupaIQ5265ItMDvnTPopcLQudx9q', 'Федоров Александр Сергеевич', 'https://funnyducks.ru/upload/iblock/0cd/0cdeb7ec3ed6fddda0f90fccee05557d.jpg', 'Тестировщик', '2024-02-12T08:36'),
(5, 'gnazarov', '$2a$12$QH3S01HpdzDARg4qrZ4Qee9SkFmxmau2SiEvsSg5M17K2vBBm673O', 'Назаров Г. Н.', 'https://funnyducks.ru/upload/iblock/0cd/0cdeb7ec3ed6fddda0f90fccee05557d.jpg', 'Администратор', '2024-02-12T08:36');
INSERT INTO code (value) INSERT INTO code (value)
VALUES VALUES
@ -17,3 +18,11 @@ VALUES
(1122334455667788990), (1122334455667788990),
(998877665544332211), (998877665544332211),
(5566778899001122334); (5566778899001122334);
INSERT INTO employee_authorities(employee_id, authorities_id)
VALUES
(1, 1),
(2, 1),
(3, 1),
(4, 1),
(5, 2);

View File

@ -2,4 +2,21 @@ CREATE TABLE IF NOT EXISTS authorities(
id auto_increment primary key, authority VARCHAR(255)); id auto_increment primary key, authority VARCHAR(255));
CREATE TABLE IF NOT EXISTS employee( CREATE TABLE IF NOT EXISTS employee(
id auto_increment primary key, username VARCHAR(255), password VARCHAR(255), name VARCHAR(255), photo VARCHAR(255), job_pos VARCHAR(255), last_visit VARCHAR(255)); id auto_increment primary key,
username VARCHAR(255),
password VARCHAR(255),
name VARCHAR(255),
photo VARCHAR(255),
job_pos VARCHAR(255),
last_visit VARCHAR(255)
--authorities_id BIGINT NOT NULL,
--CONSTRAINT fk_employee_authorities FOREIGN KEY(authorities_id) REFERENCES authorities(id)
);
CREATE TABLE IF NOT EXISTS employee_authorities(
employee_id BIGINT NOT NULL,
authorities_id BIGINT NOT NULL,
PRIMARY KEY(employee_id, authorities_id),
CONSTRAINT fk_employee_empauth FOREIGN KEY(employee_id) REFERENCES employee(id),
CONSTRAINT fk_authorities_empauth FOREIGN KEY(authorities_id) REFERENCES authorities(id)
);