在这一节,我们将把之前的SeurityConfiguration的类分成下面两个:
1) ApiSecurityConfiguration :这个是首先被布局的。这个确保使用基本的身份验证RESTful。
2) WebSecurityConfiguration :这个是布局重置登录的页面。
我们一样的删除了之前的SeurityConfiguration,然后在相同的包下面添加ApiSecurityConfiguration类,加入的代码如下 :
package masterSpringMVC6.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; import org.springframework.http.HttpMethod; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; /** * 基础权限的设定,关于用户的权限 * Created by OwenWilliam on 2016/5/21. */ @Configuration @Order(1)//最先执行 public class ApiSecurityConfiguration extends WebSecurityConfigurerAdapter { /** * 这个是数据库提取相匹配的。 * 这里我们规定是固定的用户名和密码 * @param auth * @throws Exception */ @Autowired public void configureAuth(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication().withUser("user").password("user").roles("USER").and() .withUser("admin").password("admin").roles("USER", "ADMIN"); } /** * 规定什么样的角色可以有什么样的操作 * 如,User的只能查看,admin有CRUD * @param http * @throws Exception */ @Override protected void configure(HttpSecurity http) throws Exception { http .antMatcher("/api/**") .httpBasic().and() .csrf().disable() .authorizeRequests() .antMatchers(HttpMethod.GET).hasRole("USER") .antMatchers(HttpMethod.POST).hasRole("ADMIN") .antMatchers(HttpMethod.PUT).hasRole("ADMIN") .antMatchers(HttpMethod.DELETE).hasRole("ADMIN") .anyRequest().authenticated(); } }
在相同的包下添加,然后加下的代码如下:
package masterSpringMVC6.config; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; /** * 登录的权限,像URI的地址 * Created by OwenWilliam on 2016/5/21. */ @Configuration public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .formLogin() .loginPage("/login") .defaultSuccessUrl("/profile") .and() .logout().logoutSuccessUrl("/login") .and() .authorizeRequests() .antMatchers("/webjars/**", "/login", "/signin/**", "/signup").permitAll() .anyRequest().authenticated(); } }
上面的代码就已经规格了登录的页面的重置到login的视图页面。所以我们还需要加入个视图页面。在加入视图页面时,我们需要定义个控制器,让控制器来调用视图。
在authentication的包下加入LoginController的类。
package masterSpringMVC6.authentication; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /** * 用户普通登录 * Created by OwenWilliam on 2016/5/21. */ @Controller public class LoginController { @RequestMapping("/login") public String authenticate() { return "login"; } }
好了,我们现在添加个login.html.
<!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorator="layout/default"> <head> <title>Login</title> </head> <body> <div class="section no-pad-bot" layout:fragment="content"> <div class="container"> <h2 class="header center orange-text">Login</h2> <div class="row"> <div id="errorMessage" class="card-panel red lighten-2" th:if="${param.error}"> <span class="card-title">Invalid user name or password</span> </div> <form class="col s12" action="/login" method="post"> <div class="row"> <div class="input-field col s12"> <input id="username" name="username" type="text" class="validate"/> <label for="username">Username</label> </div> </div> <div class="row"> <div class="input-field col s12"> <input id="password" name="password" type="password" class="validate"/> <label for="password">Password</label> </div> </div> <div class="row center"> <button class="btn indigo waves-effect waves-light" type="submit" name="action">Submit <i class="mdi-content-send right"></i> </button> </div> <!--伪造自己的信息,使其可信用,去跨站访问--> <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/> </form> </div> </div> </div> </body> </html>
这章节的学习,我们主要是优化上一节的内容,我们自己定义一个登录的页面,这个页面更适合我们的系统。同时,我们将SeurityConfiguration给分割成了两个,可以说ApiSeurityConfiguration是API用的,而WebSeurityConfiguration是我们访问网站时的页面跳转。最后,我们登录的页面如下。
源码下载:[email protected]:owenwilliam/masterSpringMVC6.git