Spring Security - Spring Boot - pomoc mile widziana

0

Ostatnio zaczęłam pisać aplikację w Spring Boot. No i postanowiłam wprowadzić Spring Security, ale nie rozumiem do końca działania i chciałabym podpytać o pomoc. Otóż zależy mi na tym aby po zalogowaniu użytkownika przełączyło mnie na stronę główną. I nie rozumiem do końca jak przetrzymywać przy Spring Security użytkownika w sesji itd. Wstawiam poniżej zdjęcia z projektu, tego co dotychczas udało mi się zrobić.

screenshot-20190122154808.png
screenshot-20190122154828.png
screenshot-20190122154849.png
screenshot-20190122154908.png
screenshot-20190122154931.png
screenshot-20190122154953.png
screenshot-20190122155024.png
screenshot-20190122155053.png

0

Chciałabym po procesie rejestracji, gdy użytkownik zostanie zapisany do bazy danych, zalogować się na niego i aby po poprawnym podaniu danych przekierowało mnie na homepage

0

Byłoby miło, gdybyś mogła zamiast wycinków zrzutów ekranu wrzucić (sformatowany) kod, w ten sposób:
```java
// Twój kod źródłowy
```
Raz, tragicznie się to czyta. Dwa, jeśli ktoś będzie chciał Ci pokazać, gdzie dopisać brakujące linijki - będzie musiał wszystko przepisywać z ekranu. Trzy - nie ma nawet jak wkleić tego do zwykłego notatnika i zrobić z tym cokolwiek bez przepisywania.

0
superdurszlak napisał(a):

Byłoby miło, gdybyś mogła zamiast wycinków zrzutów ekranu wrzucić (sformatowany) kod, w ten sposób:
```java
// Twój kod źródłowy
```
Raz, tragicznie się to czyta. Dwa, jeśli ktoś będzie chciał Ci pokazać, gdzie dopisać brakujące linijki - będzie musiał wszystko przepisywać z ekranu. Trzy - nie ma nawet jak wkleić tego do zwykłego notatnika i zrobić z tym cokolwiek bez przepisywania.

nie ma problemu już poprawię :)

1
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Configuration
@EnableWebSecurity
@EnableJpaRepositories(basePackageClasses = UserRepository.class)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    CustomUserDetailsService userDetailsService;
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService)
                .passwordEncoder(getPasswordEncoder());
    }
    
    @Override
    protected void configure (HttpSecurity http) throws Exception {

        http.csrf().disable();
        http.authorizeRequests()
                .antMatchers( "/registration", "/logout", "/login", "/homepage/**").permitAll()
                .antMatchers("/","/**").authenticated()
                .anyRequest().permitAll()
                .and().formLogin().loginPage("/login")
                .permitAll()
                .and()
                .logout().permitAll()
                .and()
                .exceptionHandling().accessDeniedPage("/accessDenied");
    }


    private PasswordEncoder getPasswordEncoder() {
        return new PasswordEncoder() {
            @Override
            public String encode(CharSequence charSequence) {
                return charSequence.toString();
            }

            @Override
            public boolean matches(CharSequence charSequence, String s) {
                return true;
            }
        };
    }
}

import java.util.HashSet;
import java.util.Set;

@Controller
public class UserRegistrationController {

    @Autowired
    private UserRepository userRepository;

    @GetMapping(path="/registration")
    public String showRegistartionForm(Model model) {
        model.addAttribute("user", new User());
        return "registration";
    }

    @RequestMapping(path="/registration", method = RequestMethod.POST)
    public String registrationProcess(@ModelAttribute("user")User user) {

        String login = user.getLogin();
        String name = user.getUsername();
        String surname = user.getSurname();
        String password = user.getPassword();

        if (login != null && !login.isEmpty() && name != null && !name.isEmpty() && surname != null && !surname.isEmpty()
                && password != null && !password.isEmpty()) {

            String hashedPassword = BCrypt.hashpw(password, BCrypt.gensalt(10));

            Set<Role> roles = new HashSet<>();
            roles.add(Role.USER);
            user.setRole(roles);
            user.setActive(true);
            user.setPassword(hashedPassword);
            user.setUsername(name);
            user.setLogin(login);
            user.setSurname(surname);
            userRepository.save(user);

            return "login";
        }
        return "registration";
    }

}
import java.util.Collection;
import java.util.stream.Collectors;

public class CustomUserDetails extends User implements UserDetails {
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {

        return getRole()
                .stream()
                .map(role -> new SimpleGrantedAuthority("ROLE_" + role))
                .collect(Collectors.toList());
    }

    public CustomUserDetails(final User user){
        super(user);
    }

    @Override
    public String getPassword() {
        return super.getPassword();
    }

    @Override
    public String getUsername() {
        return super.getUsername();
    }

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

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

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

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

@Entity
@Getter
@Setter
@NoArgsConstructor
@EqualsAndHashCode
@ToString
@Table(name = "users")
public class User {

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

    @Column(unique = true)
    @NotEmpty
    private String login;

    @Column(unique = true)
    @Email
    @NotEmpty
    private String email;

    @NotEmpty
    private String username;

    @NotEmpty
    private String surname;

    @NotEmpty
    private String password;


    @ManyToMany(fetch = FetchType.LAZY)
    private Set<Project> project;

    @ManyToMany(mappedBy = "users")
    private Set<Task> tasks;

    private boolean active;

    @ElementCollection(fetch = FetchType.EAGER)
    @Enumerated(EnumType.STRING)
    private Set<Role> role;

    public User (User user){
        this.password = user.getPassword();
        this.id = user.getId();
        this.surname = user.getSurname();
        this.username = user.getUsername();
        this.login = user.getLogin();
        this.email = user.getEmail();
        this.role = user.getRole();
    }
}

public enum Role {

    ADMIN,
    USER
}


import java.util.List;
import java.util.Optional;

public interface UserRepository extends JpaRepository<User,Long> {

    Optional<User> findById(Long id);
    List <User> findAll();
    Optional <User> findByUsername(String username);
}
import org.springframework.security.core.Authentication;

public interface AuthenticationFacade {
    Authentication getAuthentication();
}
import java.util.Optional;

@Service
public class CustomUserDetailsService implements UserDetailsService {

    @Autowired
    private UserRepository userRepository;


    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        Optional<User> optionalUser = userRepository.findByUsername(username);

        optionalUser
                .orElseThrow(()-> new UsernameNotFoundException("Username not found"));
        return optionalUser
                .map(user -> new CustomUserDetails(user)).get();
    }
}

!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css"
          integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS" crossorigin="anonymous">
    <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.0/js/bootstrap.min.js"></script>
    <script src="//code.jquery.com/jquery-1.11.1.min.js"></script>
</head>
<body>
<div class="jumbotron">
    <div class="container">
        <h1>CRM</h1>
        <p>Welcome in CRM Application</p>
    </div>
</div>
<div class="container">
    <div class="row">
        <div class="col-md-6 col-md-offset-3">
            <div class="panel panel-login">
                <form id="register-form" method="post" th:action="@{'/registration'}" th:object="${user}" role="form" style="display:block">
                    <div class="form-group">
                        <input th:field="*{login}" name="login" id="login" tabindex="1" class="form-control" placeholder="Login">
                    </div>
                    <div class="form-group">
                        <input th:field="*{username}" name="username" id="username" tabindex="1" class="form-control" placeholder="Username">
                    </div>
                    <div class="form-group">
                        <input th:field="*{surname}" name="surname" id="surname" tabindex="1" class="form-control" placeholder="Last name">
                    </div>
                    <div class="form-group">
                        <input th:field="*{email}" name="email" id="email" tabindex="1" class="form-control" placeholder="Email">
                    </div>
                    <div class="form-group">
                        <input th:field="*{password}" type="password" name="password" id="password" tabindex="2" class="form-control" placeholder="Password">
                    </div>
                    <div class="form-group">
                        <div class="row">
                            <div class="col-sm-6 col-sm-offset-3">
                                <input type="submit" name="register-submit" id="register-submit" tabindex="4" class="form-control btn btn-register" value="Register Now">
                            </div>
                        </div>
                    </div>
                </form>
            </div>
        </div>
    </div>
</div>
</body>
</html>
0

Tak na pierwszy rzut oka

  1. Dlaczego getPasswordEncoder zwraca obiekt klasy anonimowej, której metoda encode rzuca CharSequence do String? Ta metoda powinna hashować hasło, inaczej używanie PasswordEncoder'a w ogóle mija się z celem. Dokumentacja dość jasno o tym mówi. Poza tym Spring Security sam w sobie dostarcza już gotowe implementacje wykorzystujące np. BCrypt.
  2. defaultSuccessUrl is a way to go

0 użytkowników online, w tym zalogowanych: 0, gości: 0