#java #spring-mvc #spring-security #tiles #thymeleaf
#java #spring-mvc #spring-безопасность #плитки #thymeleaf
Вопрос:
я настроил spring mvc, а thymeleaf и tiles работают нормально, теперь я пытаюсь интегрировать с ними spring security
но проблема в следующем:
1. когда приложение запускается на странице входа в систему и вводит имя пользователя и пароль, ответа нет (т.е. Оно никогда не вызывает контроллер (я использовал System.out.println("calling");
, но ничего не печатал внутри метода входа)
2. Когда я пытаюсь получить доступ к другой странице, она перенаправляет на страницу входа, но не может ее найти и выдает 404 not found
может ли какой-либо орган указать, где я ошибаюсь в своей конфигурации?
Spring-сервлет
<mvc:annotation-driven />
<context:annotation-config />
<context:component-scan base-package="org.gaca.gms.controllers" />
<bean id="templateResolver"
class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
<property name="prefix" value="/WEB-INF/" />
<property name="suffix" value=".html" />
<property name="characterEncoding" value="UTF-8" />
<property name="templateMode" value="HTML5" />
</bean>
<bean id="tilesConfigurer"
class="org.thymeleaf.extras.tiles2.spring4.web.configurer.ThymeleafTilesConfigurer">
<property name="definitions">
<list>
<value>/WEB-INF/tiles-defs.xml</value>
</list>
</property>
</bean>
<bean id="tilesViewResolver" class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
<property name="viewClass"
value="org.thymeleaf.extras.tiles2.spring4.web.view.ThymeleafTilesView" />
<property name="templateEngine" ref="templateEngine" />
<property name="characterEncoding" value="UTF-8" />
<property name="order" value="1" />
<property name="viewNames" value="templates/*,pages/*,redirect*,loginView" />
</bean>
<bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine">
<property name="templateResolver" ref="templateResolver" />
<property name="additionalDialects">
<set>
<bean class="org.thymeleaf.extras.tiles2.dialect.TilesDialect" />
<bean class="org.thymeleaf.extras.springsecurity3.dialect.SpringSecurityDialect"/>
</set>
</property>
</bean>
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:messages" />
<property name="defaultEncoding" value="UTF-8" />
</bean>
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="/WEB-INF/jdbc.properties" />
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close" p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.databaseurl}" />
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${jdbc.dialect}</prop>
<prop key="hibernate.show_sql">true</prop>
<!-- <prop key="hibernate.hbm2ddl.auto">create</prop> -->
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.connection.useUnicode">true</prop>
<prop key="hibernate.connection.characterEncoding">UTF-8</prop>
<prop key="hibernate.connection.charSet">UTF-8</prop>
</props>
</property>
</bean>
<bean id="usersService" class="org.gaca.gms.services.GenericServiceImpl"></bean>
<!-- <bean id="loginService" class="org.gaca.gms.services.GenericServiceImpl"></bean> -->
<bean id="genericDAO" class="org.gaca.gms.dao.GenericDAOImpl"></bean>
<bean id="loginController"
class="org.springframework.web.servlet.mvc.ParameterizableViewController">
<property name="viewName" value="loginView" />
</bean>
<tx:annotation-driven />
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
Tiles-defs
<tiles-definitions>
<definition name="layout" template="templates/layout" templateType="thymeleaf">
<put-attribute name="header" value="templates/header" type="thymeleaf" />
<put-attribute name="menu" value="templates/menu" type="thymeleaf" />
<put-attribute name="footer" value="templates/footer" type="thymeleaf"/>
<put-attribute name="body" />
</definition>
<definition name="loginView" extends="layout">
<put-attribute name="body" value="login.html" type="thymeleaf" />
</definition>
<definition name="pages/usersView" extends="layout">
<put-attribute name="body" value="pages/users" type="thymeleaf" />
</definition>
<definition name="pages/sendView" extends="layout">
<put-attribute name="body" value="pages/sendMessage" type="thymeleaf" />
</definition>
</tiles-definitions>
Spring-Безопасность
<global-method-security pre-post-annotations="enabled" />
<http pattern="/loginView" security="none"/>
<http use-expressions="true">
<intercept-url pattern="/resources/**" access="permitAll" />
<intercept-url pattern="/templates/**" access="permitAll" />
<intercept-url pattern="/pages/**" access="hasAuthority('User')" />
<intercept-url pattern="/pages/admin/**" access="hasRole('Admin')"/>
<form-login login-page="/loginView" authentication-failure-url="/loginView" default-target-url="/pages/usersView" always-use-default-target='true'/>
<remember-me />
</http>
<authentication-manager>
<authentication-provider>
<user-service>
<user name="admin" password="123" authorities="Admin,User" />
<user name="user" password="111" authorities="User" />
</user-service>
</authentication-provider>
</authentication-manager>
LoginController
@RequestMapping("/spring_security_login")
public String login() {
System.out.println("calling login");
return "loginView";
}
// Login form with error
@RequestMapping("/spring_security_login")
public String loginError(Model model) {
model.addAttribute("loginError", true);
return "loginView";
}
Страница входа в систему
<!DOCTYPE html>
<div xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<div sec:authentication="name"/>
<h1>Login page</h1>
<p th:if="${loginError}">Wrong user or password</p>
<form th:action="@{/j_spring_security_check}" method="post">
<label for="j_username">Username</label>:
<input type="text" id="j_username" name="j_username" /> <br />
<label for="j_password">Password</label>:
<input type="password" id="j_password" name="j_password" /> <br />
<input type="submit" value="Log in" />
</form>
</div>
Комментарии:
1. Из вашей настройки Spring Security похоже, что вы используете
/loginView
страницу входа в систему, но ваш контроллер определяет/spring_security_login
. Разве они не должны совпадать?2. @CodeChimp я попробовал это, как и прокомментировал, но ничего не изменилось
3. Можете ли вы поместить распечатки в свой контроллер, чтобы узнать, заходит ли он так далеко? Я думаю, вы обнаружите, что это не так.
4. @CodeChimp да, я сделал так, как сказал в своем вопросе, он не вызывает контроллер
5. В этом примере у них есть только один
<html>
тег, а разрешения установлены наpermitAll
: howtodoinjava.com/2014/02/15 /…