一、前言
目前JavaEE开发中,安全框架流行的主要有两个,分别是 Shiro、SpringSecurity。
之前是都是使用 Shiro 做权限管理的,原因很简单,因为大家都说这个更简单轻量,都觉得 SpringSecurity 太笨重复杂。但是在下使用了之后,觉得还是挺简单,因为我们开发基本都要以 Spring 为核心,而 SpringSecurity 更能很好地整合在一块,其和 SpringBoot 整合更是不在话下。
二、功能演示
下面使用 SpringBoot + SpringSecurity + thymeleaf,做一个简单的登录认证,以后有空在补上授权吧
说明:
①在原式页面上,输入跳转到 main.html 的 RequestMapping localhost/main ,由于还没有登录,跳转到登录界面
②在登录界面输入正确的用户名、密码,进入main.html 这个设置好的登录成功页面
③ 点击注销按钮,又回到登录页面
为了看到输入密码的内容,
type="text"
,而不用type="password"
三、代码
1、后台:使用了 SpringBoot 之后,异常简单,
① SpringSecurity 配置类
package com.cun.conf;
import org.springframework.context.annotation.Configuration;
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;
/**
* 使用 SpringSecurity 有很多好处:
* ①输入一个需要登录验证的url,先跳转到登录界面,登录成功后,立即跳转到刚才请求的url
* @author linhongcun
*
*/
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true) // 开启 SpringSecurity注解
// 1.继承WebSecurityConfigurerAdapter适配器
public class SpringSecurityConf extends WebSecurityConfigurerAdapter {
// 2.重写configure(AuthenticationManagerBuilder)、configure(HttpSecurity),快捷键Alt+Shift+S
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("cun")// 用户名
.password("123")// 用户密码
.roles("USER");// 认证后必须加入一个角色,这里随便设为USER
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable().cors().disable().headers().disable()// 一般设置去掉,否则经常报错
.authorizeRequests()
.anyRequest()
.authenticated()// 其他 url 需要身份认证
.and()
.formLogin() //开启登录
.loginPage("/login")// 指定登录请求的 url
.defaultSuccessUrl("/main") // 登录成功后的 url
.permitAll()
.and()
.logout() //开启注销
.logoutUrl("/logout") //指定注销请求的 url (default is "/logout").
.logoutSuccessUrl("/login") // 注销成功后的 url
.permitAll();
}
}
② 控制层
package com.cun.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class SpringSecurityController {
/**
* 发送登录请求,则跳转的到登录页面login.html
* @return
*/
@RequestMapping("/login")
public String login() {
//或者 return "/login",都一样,下面同理
return "login";
}
/**
* 登录成功后发送请求,则跳转到登录成功页面 mian.html
* @return
*/
@RequestMapping("/main")
public String main() {
return "main";
}
}
2、前端:仅为了演示,去除所有修饰
① 登录页面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" ></meta>
<title>登录界面</title>
<link rel="stylesheet" href="../bootstrap3/css/bootstrap-theme.min.css" />
<link rel="stylesheet" href="../bootstrap3/css/bootstrap.min.css" />
<script type="text/javascript" src="../bootstrap3/js/jquery-1.11.2.min.js"></script>
<script type="text/javascript" src="../bootstrap3/js/bootstrap.min.js"></script>
</head>
<style type="text/css">
body{
padding: 10px
}
</style>
<