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

java spring security, logowanie

Object Storage Arubacloud
0 głosów
869 wizyt
pytanie zadane 8 lutego 2018 w Java przez niezalogowany

 

Hej. Chcę dodać do swojej strony możliwość logowania i edycji danych. Dodałem zależności spring security:
 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>pl.tomek</groupId>
	<artifactId>schronisko</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>schronisko</name>
	<description></description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.10.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>


</project>



 stworzyłem konfigurację:
 

package com.tomek;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
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;

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

	@Override
	protected void configure(HttpSecurity http) throws Exception{
		
		http
		.authorizeRequests()
			.antMatchers("/registerSite").authenticated()
			.anyRequest().permitAll()			
			.and()
		.formLogin()
			.loginPage("/login")
			.permitAll()
			.and()
		.logout()
			.logoutUrl("/logout")
			.logoutSuccessUrl("/home")
			.permitAll();
	}
	
	@Autowired
	public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception{
		auth
			.inMemoryAuthentication()
				.withUser("admin").password("admin").roles("ADMIN");
	}
}

Oraz stronę:

 

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" xmlns="http://www.w3.org/1999/xhtml"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
    <title>Schronisko</title>
    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1"/>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"/>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <script type="text/javascript" th:src="@{/timer.js}"></script>
    <style>
        /* Remove the navbar's default margin-bottom and rounded borders */
        .navbar {
            margin-bottom: 0;
            border-radius: 0;
        }

        /* Set height of the grid so .sidenav can be 100% (adjust as needed) */
        .row.content {height: 450px}

        /* Set gray background color and 100% height */
        .sidenav {
            padding-top: 20px;
            background-color: #f1f1f1;
            height: 100%;
        }

        /* Set black background color, white text and some padding */
        footer {
            background-color: #555;
            color: white;
            padding: 15px;
        }

        /* On small screens, set height to 'auto' for sidenav and grid */
        @media screen and (max-width: 767px) {
            .sidenav {
                height: auto;
                padding: 15px;
            }
            .row.content {height:auto;}
        }
    </style>
</head>
<body onload="odliczanie();">

<nav class="navbar navbar-inverse">
    <div class="container-fluid">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar">
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="#"><div id="zegar"></div> </a>
        </div>
        <div class="collapse navbar-collapse" id="myNavbar">
            <ul class="nav navbar-nav">
                <li><a th:href="@{/main}">Główna</a></li>
                <li><a th:href="@{/aboutme}">O mnie</a></li>
                <li><a th:href="@{/contact}">Kontakt</a> </li>
            </ul>
            <ul class="nav navbar-nav navbar-right">
                <li><a th:href="@{/login}"><span class="glyphicon glyphicon-log-in"></span> Login</a></li>
                <li><form th:action="@{/logout}" method="post">
            		<input type="submit" value="Sign Out"/>
       			</form></li>
            </ul>
        </div>
    </div>
</nav>

<div class="container-fluid text-center">
    <div class="row content">
        <div class="col-sm-2 sidenav">

            <p><a th:href="@{/registerSite}"><button type="button" class="btn btn-primary">Dodaj zwierzaka</button></a></p>
            <p><a th:href="@{/all}"><button type="button" class="btn btn-primary">Sprawdź listę zwierzaków</button> </a></p>
            <p><a th:href="@{/deleteSite}"><button type="button" class="btn btn-primary">Usuń zwierzaka z listy</button> </a></p>
        </div>
        <div class="col-sm-8 text-left">
            <h1 th:text="${welcomeMsg}"> Welcome</h1>
            <h1>Witamy na stronie tyskiego schroniska. Znajdziesz u nas swojego zwierzaka marzeń!</h1>
        </div>
        <div class="col-sm-2 sidenav">
            <div class="well">
                <p>ADS</p>
            </div>
            <div class="well">
                <p>ADS</p>
            </div>
        </div>
    </div>
</div>

<footer class="container-fluid text-center">
    <p size="16"> &copy; 2018</p>
</footer>

</body>
</html>

Jednak po odpaleniu aplikacji pojawia się błąd:

 

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Thu Feb 08 11:01:37 CET 2018
There was an unexpected error (type=Internal Server Error, status=500).
Could not parse as expression: "/login" (login:64)

Co może być nie tak?

komentarz 8 lutego 2018 przez xenonso Mądrala (5,160 p.)
Na początek zobacz czy odpala się domyślna strona logowania. Zostaw samo formLogin() bez  loginPage() i permitAll().
komentarz 8 lutego 2018 przez niezalogowany

To była pierwsza rzecz, jaką zrobiłem i okazało się, że domyślna strona logowania odpala się. Wrzucę jeszcze kontroler logowania:

 

package com.tomek.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class LoginController {

	@RequestMapping(value="/login", method= RequestMethod.GET)
	public String login() {
		
		return "login";
	}

	
	@RequestMapping(value="/loginfailed", method = RequestMethod.GET)
	public String loginerror(Model model) {
		
		model.addAttribute("error", "true");
		return "login";
	}
	
	@RequestMapping(value="/logout", method = RequestMethod.GET)
	public String logout(Model model) {
		
		return "login";
	}
}

 

1 odpowiedź

0 głosów
odpowiedź 8 lutego 2018 przez xenonso Mądrala (5,160 p.)

W swoim projekcie miałem podobny problem i rozwiązałem go tak, że w klasie konfiguracyjnej dziedziczącej po WebMvcConfigurerAdapter zarejestrowałem ViewController, który zwracał mi widok /login
 

@Override
public void addViewControllers(ViewControllerRegistry registry) {
	registry.addViewController("/login").setViewName("loginPage");
}

Niestety projekt ten był robiony w czystym Springu bez Boota i będziesz musiał trochę pogooglać, żeby ustalić gdzie to umieścić

komentarz 8 lutego 2018 przez xenonso Mądrala (5,160 p.)
możesz też ewentualnie stworzyć osobną klasę z controllerem, który będzie mapował do /login
komentarz 8 lutego 2018 przez niezalogowany

Mam taką klasę.

 

package com.tomek.controller;
 
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
 
@Controller
public class LoginController {
 
    @RequestMapping(value="/login", method= RequestMethod.GET)
    public String login() {
         
        return "login";
    }
 
     
    @RequestMapping(value="/loginfailed", method = RequestMethod.GET)
    public String loginerror(Model model) {
         
        model.addAttribute("error", "true");
        return "login";
    }
     
    @RequestMapping(value="/logout", method = RequestMethod.GET)
    public String logout(Model model) {
         
        return "login";
    }
}

 

komentarz 8 lutego 2018 przez xenonso Mądrala (5,160 p.)
Jak wygląda twoja strona obsługująca logowanie?
komentarz 9 lutego 2018 przez niezalogowany
Tak samo jak główna strona tylko zmieniłem obszar głównej treści.

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Schronisko</title>
    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1"/>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"/>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <script type="text/javascript" th:src="@{/timer.js}"></script>
    <style>
        /* Remove the navbar's default margin-bottom and rounded borders */
        .navbar {
            margin-bottom: 0;
            border-radius: 0;
        }

        /* Set height of the grid so .sidenav can be 100% (adjust as needed) */
        .row.content {height: 450px}

        /* Set gray background color and 100% height */
        .sidenav {
            padding-top: 20px;
            background-color: #f1f1f1;
            height: 100%;
        }

        /* Set black background color, white text and some padding */
        footer {
            background-color: #555;
            color: white;
            padding: 15px;
        }

        /* On small screens, set height to 'auto' for sidenav and grid */
        @media screen and (max-width: 767px) {
            .sidenav {
                height: auto;
                padding: 15px;
            }
            .row.content {height:auto;}
        }
    </style>
</head>
<body onload="odliczanie();">

<nav class="navbar navbar-inverse">
    <div class="container-fluid">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar">
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="#"><div id="zegar"></div> </a>
        </div>
        <div class="collapse navbar-collapse" id="myNavbar">
            <ul class="nav navbar-nav">
                <li class="active"><a href="#">Główna</a></li>
                <li><a th:href="@{/aboutme}">O mnie</a></li>
                <li><a th:href="@{/contact}">Kontakt</a> </li>
            </ul>
            <ul class="nav navbar-nav navbar-right">
                <li><a th:href="/login"><span class="glyphicon glyphicon-log-in"></span> Login</a></li>
            </ul>
        </div>
    </div>
</nav>

<div class="container-fluid text-center">
    <div class="row content">
        <div class="col-sm-2 sidenav">

            <p><a th:href="@{/registerSite}"><button type="button" class="btn btn-primary">Dodaj zwierzaka</button></a></p>
            <p><a th:href="@{/all}"><button type="button" class="btn btn-primary">Sprawdź listę zwierzaków</button> </a></p>
            <p><a th:href="@{/deleteSite}"><button type="button" class="btn btn-primary">Usuń zwierzaka z listy</button> </a></p>
        </div>
        <div class="col-sm-8 text-left">
            <h1 th:text="${welcomeMsg}"> Welcome</h1>
          
            <div th:if="${param.error}">
            Invalid username and password.
        </div>
        <div th:if="${param.logout}">
            You have been logged out.
        </div>
        <form th:action="@{/login}" method="post">
            <div><label> User Name : <input type="text" name="username"/> </label></div>
            <div><label> Password: <input type="password" name="password"/> </label></div>
            <div><input type="submit" value="Sign In"/></div>
        </form>
           
        </div>
        <div class="col-sm-2 sidenav">
            <div class="well">
                <p>ADS</p>
            </div>
            <div class="well">
                <p>ADS</p>
            </div>
        </div>
    </div>
</div>

<footer class="container-fluid text-center">
    <p size="16"> &copy; 2018</p>
</footer>

</body>
</html>


 

Podobne pytania

0 głosów
1 odpowiedź 1,045 wizyt
pytanie zadane 14 marca 2018 w Java przez Tomek Reda Obywatel (1,110 p.)
0 głosów
1 odpowiedź 1,109 wizyt
pytanie zadane 19 kwietnia 2018 w Java przez LockeLamora Użytkownik (740 p.)
0 głosów
1 odpowiedź 1,196 wizyt
pytanie zadane 7 lutego 2018 w Java przez niezalogowany

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 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!

...