Commit a4497676 by Bogdan Andjelkovic

spring security 1

parent 9415f63c
package com.example.SkuciSe.configuration;
import com.example.SkuciSe.model.korisnik.KorisnikDetailsService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter
{
@Bean
public UserDetailsService userDetailsService() {
return new KorisnikDetailsService();
}
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public DaoAuthenticationProvider authenticationProvider() {
DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
authenticationProvider.setUserDetailsService( this.userDetailsService());
authenticationProvider.setPasswordEncoder( this.passwordEncoder());
return authenticationProvider;
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider( authenticationProvider());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/index").authenticated()
.anyRequest().permitAll()
.and().formLogin()
.usernameParameter("email")
.defaultSuccessUrl("/index")
.permitAll()
.and()
.logout().logoutSuccessUrl("/").permitAll();
}
}
package com.example.SkuciSe.controller; package com.example.SkuciSe.controller;
import com.example.SkuciSe.model.korisnik.Korisnik; import com.example.SkuciSe.model.korisnik.Korisnik;
import com.example.SkuciSe.model.korisnik.KorisnikDetails;
import com.example.SkuciSe.repository.KorisnikRepository; import com.example.SkuciSe.repository.KorisnikRepository;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
...@@ -16,27 +18,29 @@ public class AppController ...@@ -16,27 +18,29 @@ public class AppController
KorisnikRepository kRepo; KorisnikRepository kRepo;
@GetMapping({"/","","/index"}) @GetMapping({"/","","/index"})
public String getIndex( Model model ) public String getIndex(Model model, @AuthenticationPrincipal KorisnikDetails korisnik)
{ {
model.addAttribute("loggedUser", korisnik);
return("index"); return("index");
} }
@GetMapping("/login") @GetMapping("/login")
public String getLogin( Model model ) public String getLogin( Model model )
{ {
model.addAttribute("newUser", new Korisnik());
return("login"); return("login");
} }
@GetMapping("/register") @GetMapping("/register")
public String getRegister( Model model ) public String getRegister( Model model )
{ {
model.addAttribute("newUser", new Korisnik());
return("register"); return("register");
} }
@PostMapping("/register-proccess") @PostMapping("/register-proccess")
public String postRegisterProccess(@ModelAttribute Korisnik korisnik) public String postRegisterProccess(@ModelAttribute Korisnik korisnik)
{ {
System.out.println(korisnik);
kRepo.insert( korisnik); kRepo.insert( korisnik);
return("redirect:/login"); return("redirect:/login");
} }
......
package com.example.SkuciSe.model.korisnik;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.Collection;
public class KorisnikDetails implements UserDetails {
private Korisnik korisnik;
public Korisnik getKorisnik()
{
return korisnik;
}
public KorisnikDetails(Korisnik user) {
this.korisnik = korisnik;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return null;
}
@Override
public String getPassword() {
return korisnik.getEmail();
}
@Override
public String getUsername() {
return korisnik.getEmail();
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
package com.example.SkuciSe.model.korisnik;
import com.example.SkuciSe.repository.KorisnikRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
public class KorisnikDetailsService implements UserDetailsService
{
@Autowired
KorisnikRepository kRepo;
@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
Korisnik korisnik = kRepo.findByEmail(email);
if (korisnik != null)
{
return new KorisnikDetails( korisnik);
}
return null;
}
}
package com.example.SkuciSe.repository; package com.example.SkuciSe.repository;
import com.example.SkuciSe.model.korisnik.Korisnik; import com.example.SkuciSe.model.korisnik.Korisnik;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.sql.*; import java.sql.*;
...@@ -22,7 +24,7 @@ public class KorisnikRepository ...@@ -22,7 +24,7 @@ public class KorisnikRepository
public void insert(Korisnik korisnik) public void insert(Korisnik korisnik)
{ {
String sql = "insert into korisnik( ime, prezime, telefon, email, sifra, tipId) values('"+korisnik.getIme()+"','"+korisnik.getPrezime()+"','"+korisnik.getTelefon()+"','"+korisnik.getEmail()+"','"+korisnik.getSifra()+"',1)"; String sql = "insert into korisnik( ime, prezime, telefon, email, sifra, tipId) values('"+korisnik.getIme()+"','"+korisnik.getPrezime()+"','"+korisnik.getTelefon()+"','"+korisnik.getEmail()+"','"+new BCryptPasswordEncoder().encode(korisnik.getSifra())+"',1)";
try { try {
statement.executeUpdate( sql); statement.executeUpdate( sql);
} catch (SQLException e) { } catch (SQLException e) {
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-gH2yIJqKdNHPEq0n4Mqa/HGKIhSkIHeL5AyhkYV8i59U5AR6csBvApHHNl/vI1Bx" crossorigin="anonymous"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-gH2yIJqKdNHPEq0n4Mqa/HGKIhSkIHeL5AyhkYV8i59U5AR6csBvApHHNl/vI1Bx" crossorigin="anonymous">
<!-- Core theme CSS (includes Bootstrap)--> <!-- Core theme CSS (includes Bootstrap)-->
<link href="../static/css/style.css" rel="stylesheet" /> <link href="/css/style.css" rel="stylesheet" />
</head> </head>
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
<header> <header>
<nav> <nav>
<ul> <ul>
<li><a href="index.html">Pocetna</a></li> <li><a th:href="@{/index}">Pocetna</a></li>
<li><a href="#">Kategorije</a></li> <li><a href="#">Kategorije</a></li>
<li><a href="#">O nama</a></li> <li><a href="#">O nama</a></li>
</ul> </ul>
...@@ -31,14 +31,17 @@ ...@@ -31,14 +31,17 @@
<!--<img src="../static/images/logo.png" alt="Logo">--> <!--<img src="../static/images/logo.png" alt="Logo">-->
<div id="navbar-login"> <div id="navbar-login">
<ul> <ul>
<li><a href="login.html"><i class="fas fa-sign-in-alt"></i><span style="padding:5px;">Uloguj se</span></a></li> <li><a th:href="@{/login}"><i class="fas fa-sign-in-alt"></i><span style="padding:5px;">Uloguj se</span></a></li>
<li><a href="register.html"><i class="fa-solid fa-circle-user"></i><span style="padding:5px;">Registruj se</span></a></li> <li><a th:href="@{/register}"><i class="fa-solid fa-circle-user"></i><span style="padding:5px;">Registruj se</span></a></li>
<li><button type="button" class="btn btn-primary btn-md"><i class="fa-regular fa-message"></i> Postavite novi oglas</button></li> <li><button type="button" class="btn btn-primary btn-md"><i class="fa-regular fa-message"></i> Postavite novi oglas</button></li>
</ul> </ul>
</div> </div>
</header> </header>
<div id="pozadina"> <div id="pozadina">
<h1>Find your next home</h1> <h1 th:object="${loggedUser}">
<span th:if="${loggedUser == null}">Uloguj se</span>
<span th:if="${loggedUser != null}" th:text="loggedUser.getKorisnik().getIme()"></span>
</h1>
</div> </div>
<footer class="text-center text-white fixed-bottom" style="background-color: #21081a;"> <footer class="text-center text-white fixed-bottom" style="background-color: #21081a;">
...@@ -51,6 +54,6 @@ ...@@ -51,6 +54,6 @@
</footer> </footer>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://kit.fontawesome.com/51d1fadef3.js" crossorigin="anonymous"></script> <script src="https://kit.fontawesome.com/51d1fadef3.js" crossorigin="anonymous"></script>
<script src="../static/js/main.js"></script> <script src="/js/main.js"></script>
</body> </body>
</html> </html>
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-gH2yIJqKdNHPEq0n4Mqa/HGKIhSkIHeL5AyhkYV8i59U5AR6csBvApHHNl/vI1Bx" crossorigin="anonymous"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-gH2yIJqKdNHPEq0n4Mqa/HGKIhSkIHeL5AyhkYV8i59U5AR6csBvApHHNl/vI1Bx" crossorigin="anonymous">
<!-- Core theme CSS (includes Bootstrap)--> <!-- Core theme CSS (includes Bootstrap)-->
<link href="../static/css/style.css" rel="stylesheet" /> <link href="/css/style.css" rel="stylesheet" />
</head> </head>
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
<header> <header>
<nav> <nav>
<ul> <ul>
<li><a href="index.html">Pocetna</a></li> <li><a th:href="@{/index}">Pocetna</a></li>
<li><a href="#">Kategorije</a></li> <li><a href="#">Kategorije</a></li>
<li><a href="#">O nama</a></li> <li><a href="#">O nama</a></li>
</ul> </ul>
...@@ -31,8 +31,8 @@ ...@@ -31,8 +31,8 @@
<!--<img src="../static/images/logo.png" alt="Logo">--> <!--<img src="../static/images/logo.png" alt="Logo">-->
<div id="navbar-login"> <div id="navbar-login">
<ul> <ul>
<li><a href="login.html"><i class="fas fa-sign-in-alt"></i><span style="padding:5px;">Uloguj se</span></a></li> <li><a th:href="@{/login}"><i class="fas fa-sign-in-alt"></i><span style="padding:5px;">Uloguj se</span></a></li>
<li><a href="register.html"><i class="fa-solid fa-circle-user"></i><span style="padding:5px;">Registruj se</span></a></li> <li><a th:href="@{/register}"><i class="fa-solid fa-circle-user"></i><span style="padding:5px;">Registruj se</span></a></li>
<li><button type="button" class="btn btn-primary btn-md"><i class="fa-regular fa-message"></i> Postavite novi oglas</button></li> <li><button type="button" class="btn btn-primary btn-md"><i class="fa-regular fa-message"></i> Postavite novi oglas</button></li>
</ul> </ul>
</div> </div>
...@@ -44,7 +44,7 @@ ...@@ -44,7 +44,7 @@
<div class="form-content"> <div class="form-content">
<div class="form-items"> <div class="form-items">
<h3>Prijavi se</h3> <h3>Prijavi se</h3>
<form class="requires-validation" novalidate> <form class="requires-validation" novalidate th:action="@{/login}" method="POST">
<div class="col-md-12"> <div class="col-md-12">
<input class="form-control" type="text" name="email" placeholder="Email" required> <input class="form-control" type="text" name="email" placeholder="Email" required>
...@@ -88,6 +88,6 @@ ...@@ -88,6 +88,6 @@
</div> </div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://kit.fontawesome.com/51d1fadef3.js" crossorigin="anonymous"></script> <script src="https://kit.fontawesome.com/51d1fadef3.js" crossorigin="anonymous"></script>
<script src="../static/js/main.js"></script> <script src="/js/main.js"></script>
</body> </body>
</html> </html>
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-gH2yIJqKdNHPEq0n4Mqa/HGKIhSkIHeL5AyhkYV8i59U5AR6csBvApHHNl/vI1Bx" crossorigin="anonymous"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-gH2yIJqKdNHPEq0n4Mqa/HGKIhSkIHeL5AyhkYV8i59U5AR6csBvApHHNl/vI1Bx" crossorigin="anonymous">
<!-- Core theme CSS (includes Bootstrap)--> <!-- Core theme CSS (includes Bootstrap)-->
<link href="../static/css/style.css" rel="stylesheet" /> <link href="/css/style.css" rel="stylesheet" />
</head> </head>
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
<header> <header>
<nav> <nav>
<ul> <ul>
<li><a href="index.html">Pocetna</a></li> <li><a th:href="@{/index}">Pocetna</a></li>
<li><a href="#">Kategorije</a></li> <li><a href="#">Kategorije</a></li>
<li><a href="#">O nama</a></li> <li><a href="#">O nama</a></li>
</ul> </ul>
...@@ -31,8 +31,8 @@ ...@@ -31,8 +31,8 @@
<!--<img src="../static/images/logo.png" alt="Logo">--> <!--<img src="../static/images/logo.png" alt="Logo">-->
<div id="navbar-login"> <div id="navbar-login">
<ul> <ul>
<li><a href="login.html"><i class="fas fa-sign-in-alt"></i><span style="padding:5px;">Uloguj se</span></a></li> <li><a th:href="@{/login}"><i class="fas fa-sign-in-alt"></i><span style="padding:5px;">Uloguj se</span></a></li>
<li><a href="register.html"><i class="fa-solid fa-circle-user"></i><span style="padding:5px;">Registruj se</span></a></li> <li><a th:href="@{/register}"><i class="fa-solid fa-circle-user"></i><span style="padding:5px;">Registruj se</span></a></li>
<li><button type="button" class="btn btn-primary btn-md"><i class="fa-regular fa-message"></i> Postavite novi oglas</button></li> <li><button type="button" class="btn btn-primary btn-md"><i class="fa-regular fa-message"></i> Postavite novi oglas</button></li>
</ul> </ul>
</div> </div>
...@@ -45,28 +45,28 @@ ...@@ -45,28 +45,28 @@
<div class="form-items"> <div class="form-items">
<h3>Registrujte se</h3> <h3>Registrujte se</h3>
<p>Popunite podatke ispod.</p> <p>Popunite podatke ispod.</p>
<form class="requires-validation" novalidate> <form class="requires-validation" novalidate th:object="${newUser}" method="POST" th:action="@{/register-proccess}">
<div class="col-md-12"> <div class="col-md-12">
<input class="form-control" type="text" name="name" placeholder="Ime" required> <input th:field="${newUser.ime}" class="form-control" type="text" name="name" placeholder="Ime" required>
<div class="valid-feedback">Dobro ime!</div> <div class="valid-feedback">Dobro ime!</div>
<div class="invalid-feedback">Ime ne sme biti prazno!</div> <div class="invalid-feedback">Ime ne sme biti prazno!</div>
</div> </div>
<div class="col-md-12"> <div class="col-md-12">
<input class="form-control" type="text" name="surname" placeholder="Prezime" required> <input th:field="${newUser.prezime}" class="form-control" type="text" name="surname" placeholder="Prezime" required>
<div class="valid-feedback">Dobro prezime!</div> <div class="valid-feedback">Dobro prezime!</div>
<div class="invalid-feedback">Prezime ne sme biti prazno!</div> <div class="invalid-feedback">Prezime ne sme biti prazno!</div>
</div> </div>
<div class="col-md-12"> <div class="col-md-12">
<input class="form-control" type="text" name="phone" placeholder="Broj telefona" required> <input th:field="${newUser.telefon}" class="form-control" type="text" name="phone" placeholder="Broj telefona" required>
<div class="valid-feedback">Dobar broj!</div> <div class="valid-feedback">Dobar broj!</div>
<div class="invalid-feedback">Broj telefona ne sme biti prazan!</div> <div class="invalid-feedback">Broj telefona ne sme biti prazan!</div>
</div> </div>
<div class="col-md-12"> <div class="col-md-12">
<input class="form-control" type="email" name="email" placeholder="E-mail Adresa" required> <input th:field="${newUser.email}" class="form-control" type="email" name="email" placeholder="E-mail Adresa" required>
<div class="valid-feedback">Dobar email!</div> <div class="valid-feedback">Dobar email!</div>
<div class="invalid-feedback">Email ne sme biti prazan!</div> <div class="invalid-feedback">Email ne sme biti prazan!</div>
</div> </div>
...@@ -74,7 +74,7 @@ ...@@ -74,7 +74,7 @@
<div class="col-md-12"> <div class="col-md-12">
<input class="form-control" type="password" name="password" placeholder="Sifra" required> <input th:field="${newUser.sifra}" class="form-control" type="password" name="password" placeholder="Sifra" required>
<div class="valid-feedback">Dobra sifra!</div> <div class="valid-feedback">Dobra sifra!</div>
<div class="invalid-feedback">Sifra ne sme biti prazna!</div> <div class="invalid-feedback">Sifra ne sme biti prazna!</div>
</div> </div>
...@@ -116,7 +116,7 @@ ...@@ -116,7 +116,7 @@
</div> </div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://kit.fontawesome.com/51d1fadef3.js" crossorigin="anonymous"></script> <script src="https://kit.fontawesome.com/51d1fadef3.js" crossorigin="anonymous"></script>
<script src="../static/js/main.js"></script> <script src="/js/main.js"></script>
<!-- Core theme JS--> <!-- Core theme JS-->
</body> </body>
</html> </html>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment