• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Spring Security

Object Storage Arubacloud
0 głosów
156 wizyt
pytanie zadane 18 sierpnia 2020 w Java przez Szyszka Gaduła (3,490 p.)

Witam. Czy coś takiego:

       public UserDetailsService userDetailsService() {
              UserDetails user = User.withDefaultPasswordEncoder().username("user").password("user1").roles("USER")
                            .build();
              return new InMemoryUserDetailsManager(user);
       }

Jest równe temu?:

package pl.szyszka;

import java.util.Arrays;
import java.util.Collection;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import lombok.Data;

@Entity
@Table(name = "USERS")
@Data
public class User implements UserDetails {
       private static final long serialVersionUID = 1L;

       @Id
       @GeneratedValue(strategy = GenerationType.IDENTITY)
       @Column(unique = true)
       private Long id;

       @Column(unique = true)
       private String username = "user";

       private String password = "user1";

       @Override
       public Collection<? extends GrantedAuthority> getAuthorities() {
              return Arrays.asList(new SimpleGrantedAuthority("USER"));
       }

       @Override
       public boolean isAccountNonExpired() {
              return true;
       }

       @Override
       public boolean isAccountNonLocked() {
              return true;
       }

       @Override
       public boolean isCredentialsNonExpired() {
              return true;
       }

       @Override
       public boolean isEnabled() {
              return true;
       }
}

No, nie licząc tego, że jedno zapisuje się w pamięci a drugie w bazie danych, oraz tego, że w jednym hasło będzie zakodowane a w drugim nie.

1 odpowiedź

0 głosów
odpowiedź 18 sierpnia 2020 przez Wiciorny Ekspert (270,190 p.)
Nie, jedno stanowi całą encję obiekt w tabeli bazy danych a drugie jest  budową serwisu
Czytaj dokumentacje metod których używasz tam jest napisane, do czego służą, za co odpowiadają, co jest zwracane etc.
komentarz 18 sierpnia 2020 przez Szyszka Gaduła (3,490 p.)
Mhm, okej. Jest możliwość, aby przestawić Spring Security w taki sposób, aby zamiast brać do logowania użytkowników z pamięci, brał on użytkowników z bazy danych?
komentarz 18 sierpnia 2020 przez Wiciorny Ekspert (270,190 p.)
ale tu nie logujesz użytkownika, tylko ustawiasz hosta...
użyc do tego odpowiednich metod pobrac użytkownika z bazy i posłać wtedy do funkcji
komentarz 19 sierpnia 2020 przez Szyszka Gaduła (3,490 p.)
Mhm, ok. Wiesz może, czy istnieje funkcja która zwraca id ostatnio dodanego rekordu? W PHP coś takiego było, a czy tutaj jest? Szukanie największej liczby chyba zajmie za dużo czasu.
komentarz 19 sierpnia 2020 przez Wiciorny Ekspert (270,190 p.)

istnieje jeśli korzystasz z spring data możesz skorzystać z funkcji dostepnej w repozytorium 
bodajże coś podobnego do 

JpaClass findFirstByOrderByIdDesc();

sprawdź w dokumentacji SpringDATA Jpa, natomiast jeśli nie to mozesz stworzyc wlasna funkcje z  własnym zapytaniem do bazy \

 

komentarz 19 sierpnia 2020 przez Szyszka Gaduła (3,490 p.)

Ok, stworzyłem własne zapytanie. Zwraca mi ID ostatnio dodanego rekordu. Tylko, teraz mam problem, że UserDetailsService chyba nie działa na @PostMapping. Kiedy zmieniłem na void

i zamiast return new InMemoryUserDetailsManager() zrobiłem po prostu new InMemoryUserDetailsManager(), też nic to nie dało. Dlaczego? Tak to wygląda:

package pl.szyszka;

import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.transaction.Transactional;

import org.springframework.data.jpa.repository.Modifying;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

@Controller
public class RegisterController {
       private final UserRepository userRepository;
       private final EntityManager entityManager;

       RegisterController(UserRepository userRepository, EntityManager entityManager) {
              this.userRepository = userRepository;
              this.entityManager = entityManager;
       }

       @GetMapping("/register")
       public String registerForm(Model model) {
              model.addAttribute("userr", new Userr());
              return "register";
       }

       @PostMapping("/register")
       @Transactional
       @Modifying
       public UserDetailsService saveData(Userr userr) {
              userRepository.save(userr);
              Query query = entityManager.createQuery("SELECT id FROM Userr ORDER BY id DESC");
              return new InMemoryUserDetailsManager(User.withDefaultPasswordEncoder()
                            .username(query.setMaxResults(1).getSingleResult().toString()).password("user1")
                            .roles("USER").build());
       }
}

Może jakoś inaczej trzeba to zapisać do pamięci?

komentarz 19 sierpnia 2020 przez Wiciorny Ekspert (270,190 p.)

Powtarzam czytaj to z czego korzystasz... tak samo jak  adnotacje widzę raz, ze niepotrzebne dwa... nieodpowiednie tam gdzie być ich nie powinno.



Non-persistent implementation of UserDetailsManager which is backed by an in-memory map.

 https://docs.spring.io/spring-security/site/docs/4.2.17.BUILD-SNAPSHOT/apidocs/org/springframework/security/provisioning/InMemoryUserDetailsManager.html

komentarz 19 sierpnia 2020 przez Szyszka Gaduła (3,490 p.)
Przez mapę w pamięci, okej, rozumiem, czemu nie działa. Meh. Uczę się springa ze 3 tygodnie, weź, proszę, wyjaśnij mi jak sześciolatkowi w jaki sposób te role mają współpracować z bazą danych :/
komentarz 19 sierpnia 2020 przez Szyszka Gaduła (3,490 p.)
Okej. Teraz obczaiłem na necie taką klase: AuthenticationManagerBuilder.

Wszystko śmiga jak należy. Niech Ci bóg za cierpliwość wynagrodzi :D.

Podobne pytania

0 głosów
1 odpowiedź 494 wizyt
pytanie zadane 21 sierpnia 2020 w Java przez Szyszka Gaduła (3,490 p.)
0 głosów
1 odpowiedź 135 wizyt
pytanie zadane 14 sierpnia 2020 w Java przez Szyszka Gaduła (3,490 p.)
0 głosów
1 odpowiedź 121 wizyt
pytanie zadane 30 sierpnia 2020 w Java przez Szyszka Gaduła (3,490 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...