2016-04-01 156 views
1

我已經搜索了谷歌頁面噸,但我仍然無法找到解決方案。我正在使用Hibernate和安全性的Spring MVC。我已經按照this教程,但是當我提交的登錄表單,也適用於404春季安全登錄返回404

注意 登錄網址是:本地主機:8080 /組合/登錄後提交是:本地主機:8080 /登錄

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初始化

package com.portfolio.config; 

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

public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { 
} 

SPRING MVC初始化

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[] { "/" }; 
    } 
} 

控制器

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> 

回答

1

正如在評論中提到 - 喲您目前正在發佈到不正確的網址。

在您的視圖中看到鏈接的教程他們有代碼:

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

但是你直接發佈到「/登錄」 - 我從您的其他信息假設「投資組合」是應用程序上下文,所以通過直接發佈到/ login嘗試在您的應用服務器上找到另一個名爲「login」的上下文。

JSP標記c:url可能會根據您的上下文找出應用程序特定的URL(因此您不必將應用程序的名稱硬編碼到視圖中)。

在最起碼,切換到該方法按照本教程,您將不再獲得這樣的經歷:

注意登錄網址是:本地主機:8080 /組合/登錄後提交,它是: 本地主機:8080/login

因爲它會開始發佈到您的應用程序。一旦你有這樣的變化,併發布到你的應用程序的URL,你可能仍然會得到其他錯誤,但你至少應該開始獲得Spring日誌記錄(因爲請求現在會讓它到Spring應用程序) - 所以如果它仍然失敗後那麼,然後添加在這種情況下得到的日誌/錯誤。

+0

它的工作原理!我還在login.jsp和'.and() .formLogin()。loginPage(「/ login」) .usernameParameter(「ssoId」)。passwordParameter中添加了這個'<%@ page isELIgnored =「false」%> (「密碼」) .defaultSuccessUrl(「/ admin」)'到安全配置。現在,當我以管理員角色登錄時,它轉到'/ admin',但是給出了'拒絕訪問' – jog

+0

酷 - 你如何在UserDetailsS​​ervice中設置角色? (教程中的示例在角色開始時顯式地添加了「ROLE_」,但是他們的安全配置只是做了hasRole(「ADMIN」) - 我完全記不清細節,但之前已經被這個東西發現了 - 在某處ROLE_前綴是默認的,所以如果你的UserDetailsS​​ervice和教程完全一樣,試着改變你的安全配置,只檢查沒有ROLE_前綴的角色 – rhinds

+0

我的UserDetialsService和教程是一樣的,我刪除了ROLE_前綴,但是它仍然給予訪問拒絕msg – jog