2016-04-01 13 views
1

Ich habe Tonnen von Google-Seiten gesucht, aber ich kann immer noch keine Lösung dafür finden. Ich verwende Spring MVC mit Ruhezustand und Sicherheit. Ich habe this Tutorial gefolgt, aber wenn ich Login-Formular einreichen geht es für 404.Spring Security Login zurück 404

HINWEIS Login URL ist: localhost: 8080/Portfolio/login nach eintragen ist: localhost: 8080/login

CONFIG

package com.portfolio.config; 

import org.springframework.context.MessageSource; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.Import; 
import org.springframework.context.support.ResourceBundleMessageSource; 
import org.springframework.web.servlet.LocaleResolver; 
import org.springframework.web.servlet.ViewResolver; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 
import org.springframework.web.servlet.config.annotation.InterceptorRegistry; 
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 
import org.springframework.web.servlet.i18n.CookieLocaleResolver; 
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; 
import org.springframework.web.servlet.view.InternalResourceViewResolver; 
import org.springframework.web.servlet.view.JstlView; 
import org.springframework.web.servlet.view.UrlBasedViewResolver; 

import java.util.Locale; 

@Configuration 
@ComponentScan(basePackages = "com.portfolio") 
@EnableWebMvc 
public class Config extends WebMvcConfigurerAdapter{ 
    @Bean 
    public ViewResolver setupViewResolver() 
    { 
     InternalResourceViewResolver resolver = new InternalResourceViewResolver(); 
     resolver.setPrefix("/WEB-INF/views/"); 
     resolver.setSuffix(".jsp"); 
     resolver.setViewClass(JstlView.class); 

     return resolver; 
    } 

    @Bean 
    public MessageSource messageSource() 
    { 
     ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); 
     messageSource.setBasename("messages"); 

     return messageSource; 
    } 

    @Bean 
    public LocaleResolver localeResolver() 
    { 
     CookieLocaleResolver resolver = new CookieLocaleResolver(); 
     resolver.setDefaultLocale(new Locale("pl")); 
     resolver.setCookieName("locale"); 
     resolver.setCookieMaxAge(86400); 

     return resolver; 
    } 

    @Override 
    public void addInterceptors(InterceptorRegistry registry) 
    { 
     LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor(); 
     interceptor.setParamName("locale"); 
     registry.addInterceptor(interceptor); 
    } 
} 

HIBERNATE CONFIG

package com.portfolio.config; 

import org.hibernate.SessionFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.*; 
import org.springframework.core.env.Environment; 
import org.springframework.jdbc.datasource.DriverManagerDataSource; 
import org.springframework.orm.hibernate4.HibernateTransactionManager; 
import org.springframework.orm.hibernate4.LocalSessionFactoryBean; 
import org.springframework.transaction.annotation.EnableTransactionManagement; 

import javax.sql.DataSource; 
import java.util.Properties; 

@Configuration 
@EnableTransactionManagement 
@ComponentScan({ "com.portfolio.config" }) 
@PropertySource({ "classpath:application.properties" }) 
public class Hibernate { 
    @Autowired 
    private Environment environment; 

    @Bean 
    public LocalSessionFactoryBean sessionFactory() 
    { 
     LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); 
     sessionFactory.setDataSource(dataSource()); 
     sessionFactory.setPackagesToScan("com.portfolio.entity"); 
     sessionFactory.setHibernateProperties(hibernateProperties()); 

     return sessionFactory; 
    } 

    @Bean(name = "dataSource") 
    public DataSource dataSource() 
    { 
     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName")); 
     dataSource.setUrl(environment.getRequiredProperty("jdbc.url")); 
     dataSource.setUsername(environment.getRequiredProperty("jdbc.username")); 
     dataSource.setPassword(environment.getRequiredProperty("jdbc.password")); 

     return dataSource; 
    } 

    private Properties hibernateProperties() 
    { 
     Properties properties = new Properties(); 
     properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect")); 
     properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql")); 
     properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql")); 

     return properties; 
    } 

    @Bean 
    @Autowired 
    public HibernateTransactionManager transactionManager(SessionFactory s) 
    { 
     HibernateTransactionManager txManager = new HibernateTransactionManager(); 
     txManager.setSessionFactory(s); 

     return txManager; 
    } 
} 

SECURITY CONFIG

package com.portfolio.config; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.context.annotation.ComponentScan; 
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; 
import org.springframework.security.core.userdetails.UserDetailsService; 

import javax.sql.DataSource; 

@Configuration 
@EnableWebSecurity 
public class Security extends WebSecurityConfigurerAdapter { 
    @Autowired 
    @Qualifier("customerUserDetailsService") 
    UserDetailsService userDetailsService; 

    @Autowired 
    public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception 
    { 
     auth.userDetailsService(userDetailsService); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception 
    { 
     http.authorizeRequests() 
       .antMatchers("/").permitAll() 
       .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')") 
       .and() 
        .formLogin().loginPage("/login") 
        .usernameParameter("ssoId").passwordParameter("password") 
       .and() 
        .csrf() 
       .and() 
        .exceptionHandling().accessDeniedPage("/403"); 
    } 
} 

SECURITY WEB APP Initialisierer

package com.portfolio.config; 

import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer; 

public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { 
} 

SPRING MVC Initialisierer

package com.portfolio.config; 

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; 

public class SpringMvcInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 
    @Override 
    protected Class<?>[] getRootConfigClasses() { 
     return new Class[] { Config.class }; 
    } 

    @Override 
    protected Class<?>[] getServletConfigClasses() { 
     return null; 
    } 

    @Override 
    protected String[] getServletMappings() { 
     return new String[] { "/" }; 
    } 
} 

-Controller

package com.portfolio.controller; 

import org.springframework.security.core.context.SecurityContextHolder; 
import org.springframework.security.core.userdetails.UserDetails; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RequestParam; 
import org.springframework.web.servlet.ModelAndView; 

@Controller 
public class DefaultController { 
    @RequestMapping("/") 
    public String index() { 
     return "index"; 
    } 

    @RequestMapping(value = "/login", method = RequestMethod.GET) 
    public ModelAndView loginPage() { 
     ModelAndView mv = new ModelAndView(); 
     mv.setViewName("login"); 

     return mv; 
    } 

    @RequestMapping(value = "/admin", method = RequestMethod.GET) 
    public ModelAndView adminPage() 
    { 
     ModelAndView mv = new ModelAndView(); 
     mv.addObject("user", getPrincipal()); 
     mv.setViewName("admin"); 

     return mv; 
    } 

    private String getPrincipal() 
    { 
     String username = null; 
     Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 

     if (principal instanceof UserDetails) { 
      username = ((UserDetails) principal).getUsername(); 
     } else { 
      username = principal.toString(); 
     } 

     return username; 
    } 
} 

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> 
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 
<!DOCTYPE html> 
<html> 
<head> 
    <title>Spring Security Example</title> 
</head> 
<body class="security-app"> 
<div class="details"> 
    <h2>Spring Security - JDBC Authentication</h2> 
    <a href="http://www.programming-free.com/2015/09/spring-security-jdbc-authentication.html" class="button green small">Tutorial</a> 
    <a href="https://github.com/priyadb/SpringSecurityJdbcApp/archive/master.zip" 
     class="button red small">Download</a> 
</div> 

<form action="/login" method="post"> 

    <div class="lc-block"> 
     <div> 
      <input type="text" class="style-4" name="ssoId" id="username" 
        placeholder="User Name" /> 
     </div> 
     <div> 
      <input type="password" class="style-4" name="password" id="password" 
        placeholder="Password" /> 
     </div> 
     <div> 
      <input type="submit" value="Sign In" class="button red small" /> 
     </div> 
    </div> 
    <input type="hidden" name="${_csrf.parameterName}" 
      value="${_csrf.token}" /> 
</form> 

</body> 
</html> 

pom.xml

<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/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.portfolio</groupId> 
    <artifactId>Portfolio</artifactId> 
    <packaging>war</packaging> 
    <version>1.0-SNAPSHOT</version> 
    <name>Portfolio Maven Webapp</name> 
    <url>http://maven.apache.org</url> 
    <properties> 
    <spring.version>4.2.5.RELEASE</spring.version> 
    <spring.security.version>4.0.4.RELEASE</spring.security.version> 
    <mysql.connector.version>5.1.31</mysql.connector.version> 
    <hibernate.version>4.3.6.Final</hibernate.version> 
    <joda-time.version>2.9.3</joda-time.version> 
    <jstl.version>1.2</jstl.version> 
    </properties> 
    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
    <!-- Spring dependencies --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-core</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-web</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-tx</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-orm</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 
    <!-- SPRING SECURITY --> 
    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-web</artifactId> 
     <version>${spring.security.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-config</artifactId> 
     <version>${spring.security.version}</version> 
    </dependency> 
    <!-- MySQL --> 
    <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>${mysql.connector.version}</version> 
    </dependency> 
    <!-- Hibernate --> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>${hibernate.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-validator</artifactId> 
     <version>5.1.3.Final</version> 
    </dependency> 
    <!-- Joda-Time --> 
    <dependency> 
     <groupId>joda-time</groupId> 
     <artifactId>joda-time</artifactId> 
     <version>${joda-time.version}</version> 
    </dependency> 
    <!-- To map JodaTime with database type --> 
    <dependency> 
     <groupId>org.jadira.usertype</groupId> 
     <artifactId>usertype.core</artifactId> 
     <version>3.0.0.CR1</version> 
    </dependency> 
    <!-- Spring Security JSP Taglib --> 
    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-taglibs</artifactId> 
     <version>${spring.security.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>javax.servlet-api</artifactId> 
     <version>3.1.0</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet.jsp</groupId> 
     <artifactId>javax.servlet.jsp-api</artifactId> 
     <version>2.3.1</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>jstl</artifactId> 
     <version>1.2</version> 
    </dependency> 
    </dependencies> 
    <build> 
    <finalName>Portfolio</finalName> 
    </build> 
</project> 

Antwort

1

Wie in den Kommentaren erwähnt - yo Sie veröffentlichen gerade eine falsche URL.

In der verknüpften Tutorial Sie in der Ansicht sehen sie den Code:

<c:url var="loginUrl" value="/login" /> 
<form action="${loginUrl}" method="post" class="form-horizontal"> 

Aber Sie sind Entsendung direkt „/ login“ - ich aus dem anderen Informationen davon aus, dass „Portfolio“ ist der Kontext Anwendung Wenn Sie also direkt in "/ login" schreiben, wird versucht, einen anderen Kontext auf Ihrem App-Server namens "login" zu finden.

Das JSP-Tag c: url erstellt wahrscheinlich die anwendungsspezifische URL basierend auf Ihrem Kontext (Sie müssen also den Namen Ihrer App nicht fest in die Ansicht codieren).

In allerwenigsten zu diesem Ansatz Umschalten nach dem Tutorial nicht mehr diese Erfahrung erhalten:

HINWEIS Login URL ist: localhost: 8080/Portfolio/login es nach einreichen ist: localhost : 8080/login

wie es beginnen wird, zu Ihrer Anwendung bekannt zu geben.Sobald Sie diese Änderung vorgenommen haben und in Ihrer App-URL posten, erhalten Sie möglicherweise noch weitere Fehler, aber Sie sollten zumindest die Spring-Protokollierung starten (da die Anfrage jetzt die Spring-App erreichen wird) - wenn sie danach immer noch fehlschlägt Fügen Sie dann die Protokolle/Fehler hinzu, die Sie in diesem Fall erhalten.

+0

es funktioniert! Ich habe auch diese '<% @ page isELIgnored =" false "%>' zu login.jsp und '.and() .formLogin() hinzugefügt. loginPage ("/login ") .usernameParameter (" ssoId "). passwordParameter ("password") .defaultSuccessUrl ("/ admin") 'zur Sicherheitskonfiguration. Jetzt, wenn ich mich als Benutzer mit Admin-Rolle anmelde, geht es zu '/ admin', aber gibt 'access denied' zurück. – jog

+0

Cool - wie stellst du die Rollen im UserDetailsService ein? (Das Beispiel im Tutorial fügt am Anfang der Rolle explizit "ROLE_" hinzu, aber ihre Sicherheitskonfiguration hat nur hasRole ("ADMIN") - ich kann mich nicht genau an die Details erinnern, bin aber von diesen Dingen schon einmal erwischt worden - irgendwo ist das Präfix ROLE_ voreingestellt - also, wenn Ihr UserDetailsService genau mit dem Tutorial übereinstimmt, versuchen Sie Ihre Sicherheitskonfiguration zu ändern, um nur nach der Rolle ohne das ROLE_ Präfix zu suchen – rhinds

+0

Mein UserDetialsService ist der selbe wie das Tutorial Ich habe das ROLE_ Präfix aber entfernt Es gibt immer noch Zugang verweigert Nachricht – jog

Verwandte Themen