0% found this document useful (0 votes)
31 views52 pages

OppSpringBackend 2

Uploaded by

clickvillagesite
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPSX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
31 views52 pages

OppSpringBackend 2

Uploaded by

clickvillagesite
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPSX, PDF, TXT or read online on Scribd

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

You might also like