uvod - dio
drugi
Hrvoje Šimić
hsimic@[Link]
Druga domenska klasa
@Entity
Entitet "grupa" public class Group {
ID grupe, @Id @GeneratedValue
surogatni primarni ključ private Long id;
@Column(unique=true, nullable=false)
ime grupe je jedinstveno, @Size(min=1, max=20)
obavezno, 1-20 znakova private String name;
1 grupa = 1 student @OneToOne
koordinator private Student coordinator;
@OneToMany
1 grupa = više članova private Set<Student> members;
geteri, seteri, toString...
Gdje je tablica?
GROUP_MEMBERS nije
GROUP
Syntax error in SQL statement
"DROP TABLE GROUP[*] IF EXISTS
";
expected "identifier"
Promijenimo ime
tablice
@Entity(name="SGROUP")
public class Group {
@OneToMany
private Set<Student>
members;
«interface»
Group Group
Controller Service
Group «interface»
ServiceJp Group
a Repository
Repository
Controller Service Repository
Student Student Student
Controlle ServiceJp Repositor
r a y
Group Group Group
Controlle ServiceJp Repositor
r a y
@RestController @Service
@RequestMapping("/groups") public class GroupServiceJpa
public class GroupsController { implements GroupService {
@Autowired @Autowired
private GroupService groupService; private GroupRepository groupRepo;
@Autowired @Autowired
private StudentService studentService; private StudentService studentService;
@GetMapping("") @Override
public List<Group> listGroups() { public List<Group> listAll() {
return [Link](); return [Link]();
} }
} }
public interface GroupRepository extends JpaRepository<Group,
Long> {
}
Možemo dohvatiti listu grupa
Kreiranje nove grupe
stvori
grupu
dodaj
studenta
treba ti ime
grupe i
JMBAG
koordinatora
sustav za formiranje projektnih grupa
/**
* Finds the student with given JMBAG.
* @param jmbag given student JMBAG
* @return Optional with value present if a student
«interface»
associated
Student * with given JMBAG exists in the system, or no value
Service otherwise
* @throws IllegalArgumentException if argument is null
*/
Optional<Student> findByJmbag(String jmbag);
Student public Optional<Student> findByJmbag(String jmbag) {
[Link](jmbag, "JMBAG must be given");
ServiceJp return [Link](jmbag);
a }
«interface»
Student Optional<Student> findByJmbag(String jmbag);
Repository
Pomoćni konstruktor u klasi
Group
public Group(String name, Student coordinator) {
[Link](name, "Group name must have text");
[Link](coordinator, "Coordinator must be
set");
[Link] = name;
[Link] = coordinator;
[Link] = new
HashSet<>([Link](coordinator));
}
/**
* Creates new group with given coordinator and name.
Group
* @param groupName name of the new group
Service
* @param coordinatorJmbag JMBAG of student coordinator of the new group
* @return created Group object, with ID set,
* and member list consisting only of group coordinator.
* @throws IllegalArgumentException if name is empty or any is
<code>null</code>
*/
Group createGroup(String groupName, String coordinatorJmbag);
@Override
public Group createGroup(String groupName, String coordinatorJmbag) {
Student coordinator = [Link](coordinatorJmbag).orElseThrow
() -> new RequestDeniedException("No student with JMBAG " + coordinatorJmbag
);
return [Link](new Group(groupName, coordinator));
}
Data Transfer Object
@PostMapping("")
Group public Group createGroup(@RequestBody CreateGroupDTO dto) {
Controlle return [Link]([Link](),
r [Link]());
}
public class CreateGroupDTO {
private String name;
private String leadJmbag;
...
JPQL upiti
Koordinator ne može biti član druge grupe
@Override
public Group createGroup(String groupName, String coordinatorJmbag) {
Student coordinator = [Link](coordinatorJmbag).orElseThrow
() -> new RequestDeniedException("No student with JMBAG " + coordinatorJmbag
);
[Link](coordinator).ifPresent(g -> {
throw new RequestDeniedException(coordinator + " already member of " + g);
});
return [Link](new Group(groupName, coordinator));
}
findByMember nije tipična
metoda
@OneToMany
private Set<Student>
members;
findByMembers(Set<Student> students);
Nama treba
findByMember ( Student student );
@Query("SELECT g FROM SGROUP g WHERE :s MEMBER OF [Link]")
Optional<Group> findByMember(@Param("s") Student student);
Otvaranje s članom druge grupe:
Bad Request
Postavljanje Spring
Security-ja
Dodamo Security starter u
[Link]
<dependency>
<groupId>[Link]</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
Prilikom pokretanja aplikacije pojavljuje se:
Using generated security password: 80edc1a3-2941-4874-9648-
7eefccbdc646
Konfiguracija
sigurnosti
@EnableWebSecurity
public class WebSecurity extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception
[Link]();
[Link]()
.sessionCreationPolicy([Link])
[Link]().antMatchers("/").permitAll();
[Link]().frameOptions().sameOrigin(); // h2-console
[Link]().disable();
}
}
Postavljanje korisnika
i konfiguracija vrijednosti
Naš UserDetailsService
Pribavlja detalje korisnika na temelju username-a
@Service
public class StudentUserDetailsService implements UserDetailsService
@Override
public UserDetails loadUserByUsername(String username) {
if ("admin".equals(username))
return new User(
username,
"pass",
commaSeparatedStringToAuthorityList("ROLE_ADMIN")
);
else throw new UsernameNotFoundException("No user " + username);
}
}
@SpringBootApplication
public class OppApplication {
nova @Bean
public PasswordEncoder pswdEncoder() {
komponent return new BCryptPasswordEncoder();
a }
public static void main(String[] args) {
[Link]([Link], args)
}
}
@Service
public class StudentUserDetailsService implements
UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) {
if ("admin".equals(username))
return new User(
username,
"$2a$10$7dR1nXFoZCc1I9UMEWxWDO4AIC7CRh66h5O90YlcNk7wo0GqaHoI6",
commaSeparatedStringToAuthorityList("ROLE_ADMIN")
);
else throw new UsernameNotFoundException("No user " +
username);
}
}
@Service
public class StudentUserDetailsService implements UserDetailsService {
@Value("${[Link]}")
private String adminPasswordHash;
@Override
public UserDetails loadUserByUsername(String username) {
if ("admin".equals(username))
return new User(
username,
adminPasswordHash,
commaSeparatedStringToAuthorityList("ROLE_ADMIN")
);
else throw new UsernameNotFoundException("No user " + username);
}
}
rd
wo
ss
pa
n.
mi
ad
p.
op
StudentUserDetailsService
[Link]: true
[Link]: $2a$10$7dR1nXFoZCc1I9UMEWxWDO4AIC7CRh66h5O90YlcNk7wo0GqaHo
@Value("$
{[Link]}")
Autorizacija zahtjeva
stvori
grupu
dodaj
studenta
student-
koordinator
admin
uključi
studenta
u grupu
sustav za formiranje projektnih grupa student
Student
Controlle
@PostMapping("") r
osiguraj @Secured("ROLE_ADMIN")
public Student createStudent(@RequestBody Student student) {
return [Link](student);
}
Web
Security
@EnableWebSecurity
uključi @EnableGlobalMethodSecurity(securedEnabled = true)
public class WebSecurity extends WebSecurityConfigurerAdapter
...
Korisnici u bazi
@Entity
public class Student {
@Id @GeneratedValue
private Long id;
@Column(unique=true)
@NotNull @Size(min=10, max=10)
private String jmbag;
private String givenName;
private String familyName;
samo nositelji timova private boolean isLead;
mogu osnovati grupu
@Autowired StudentUser
private StudentService studentService; DetailsService
@Override
public UserDetails loadUserByUsername(String username) {
return new User(username, adminPasswordHash, authorities(username))
}
private List<GrantedAuthority> authorities(String username) {
if ("admin".equals(username))
return commaSeparatedStringToAuthorityList("ROLE_ADMIN");
Student student = [Link](username).orElseThrow(
() -> new UsernameNotFoundException("No user '" + username + "'")
);
if ([Link]())
return commaSeparatedStringToAuthorityList("ROLE_LEAD");
else
return NO_AUTHORITIES;
}
Group
Controlle
@PostMapping("") r
@Secured("ROLE_LEAD")
public Group createGroup(@RequestBody CreateGroupDTO dto) {
return [Link]([Link](), [Link]());
}
Prepoznavanje ulogiranog
korisnika
Group
@PostMapping("")
Controlle
@Secured("ROLE_LEAD")
r
public Group createGroup(
@RequestBody CreateGroupDTO dto,
korisnik @AuthenticationPrincipal User u)
{
return [Link]([Link](), [Link]());
}
ignoriramo
vrijednost
iz DTO-a
That's all folks!
stvori
grupu
dodaj
studenta
student-
koordinator
admin
uključi
studenta
u grupu
student