開始吧
1、 給 index.jsp 設置表單
div外圍添加form表單標簽,input標簽改name屬性名,button按鈕改type類型為submit。
<p>${SPRING_SECURITY_LAST_EXCEPTION.message}</p>
<form action="${pageContext.request.contextPath }/do/login.html" method="post">
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
<div class="layadmin-user-login-box layadmin-user-login-body layui-form">
<div class="layui-form-item">
<label class="layadmin-user-login-icon layui-icon layui-icon-username" for="LAY-user-login-username"></label>
<!-- input的name屬性值必須符合SpringSecurity規則,除非專門進行了定制,否則用戶名必須使用username,密碼必須使用password -->
<input type="text" name="loginAcct" id="LAY-user-login-username" lay-verify="required" placeholder="用戶名" class="layui-input">
</div>
<div class="layui-form-item">
<label class="layadmin-user-login-icon layui-icon layui-icon-password" for="LAY-user-login-password"></label>
<input type="text" name="userPswd" id="LAY-user-login-password" lay-verify="required" placeholder="密碼" class="layui-input">
</div>
...
<div class="layui-form-item">
<button type="submit" class="layui-btn layui-btn-fluid" lay-submit lay-filter="LAY-user-login-submit">登 入</button>
</div>
...
</form>
2、 賬號、密碼的請求參數名
表單中的賬號密碼name要和SpringSecurity的賬號密碼名對上。
不對上的話:要么修改頁面上的表單項的 name 屬性值,要么修改配置。如果修改配置可以調用 usernameParameter()和 passwordParameter()方法。
SpringSecurity 默認賬號的請求參數名:username
SpringSecurity 默認密碼的請求參數名:password
3、 去后端的配置類中配置
//重寫configure方法進行配置
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity
.authorizeRequests() //對請求進行授權
.antMatchers("/index.jsp", "/layui/**") //針對 /index.jsp以及layui下的內容進行授權
.permitAll() //授權的級別:可以無條件訪問
.anyRequest() //任意請求
.authenticated() //需要登陸后才可以訪問
.and()
.formLogin() //設置未授權請求跳轉到登錄頁面
.loginPage("/index.jsp") //指定登錄頁面
.loginProcessingUrl("/do/login.html") //loginProcessingUrl()方法指定了登錄地址,就會覆蓋 loginPage()方法中設置的默認值 /index.jsp POST
.permitAll() //為登錄頁面設置所有人都可以訪問
.usernameParameter("loginAcct") //定制登錄賬號的請求參數名
.passwordParameter("userPswd") //定制登錄密碼的請求參數名
.defaultSuccessUrl("/main.html") //設置登錄成功后默認前往的 URL 地址
;
}
//重寫另外一個父類的方法,來設置登錄系統的賬號密碼(單機版,不走數據庫)
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//super.configure(auth);禁用默認規則
//出現:Cannot pass a null GrantedAuthority collection 問題是由於沒有設置roles()或authorities()方法導致的。
auth
.inMemoryAuthentication() //在內存身份驗證(單機版,不走數據庫)
.withUser("zhouzhou") //設置登錄賬號
.password("123") //設置登錄密碼
.roles("ADMIN") //設置角色
.and()
.withUser("qiongqiong") //設置另一個登錄賬號
.password("234") //設置另一個登錄密碼
.authorities("SAVE", "DEIT") //設置權限
;
}
4、 啟動服務器測試
這是因為發送登錄請求時沒有攜帶_csrf 值造成的錯誤。
去index.jsp頁面加上
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
實現的最后效果:登錄成功后具體資源都可以訪問了。