springboot(15)Spring Security

在我们的项目开发中经常需要对页面做一些安全控制:对于没有访问权限的用户需要转到登录表单页面等。要实现访问控制的方法多种多样,可以通过Aop、拦截器实现,也可以通过框架(Apache Shiro、Spring Security)实现。Spring Security框架有两个概念:认证和授权,认证可以访问系统的用户,而授权则是用户可以访问的资源。

构建项目添加security依赖

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
</dependency>

Spring Security配置

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends  WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/index").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .withUser("admin").password("123456").roles("USER");
    }
}

@EnableWebMvcSecurity注解开启Spring Security的功能 继承WebSecurityConfigurerAdapter,并重写它的方法来设置一些web安全的细节 通过authorizeRequests()定义哪些URL需要被保护、哪些不需要被保护。例如以上代码指定了/和/index不需要任何认证就可以访问,其他的路径都必须通过身份验证。 通过formLogin()定义当需要用户登录时候,转到的登录页面。 configureGlobal(AuthenticationManagerBuilder auth)方法,在内存中创建了一个用户,该用户的名称为admin,密码为123456,用户角色为USER。 注意:Spring Boot 2.0后Spring Security有些改动,不建议这样使用

index.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
<head>
    <title>Spring Security</title>
</head>
<body>
<h1>欢迎使用Spring Security!</h1>
<p>点击 <a th:href="@{/list}">这里</a> 查看列表</p>
</body>
</html>

login.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org"
<head>
    <title>Spring Security Example </title>
</head>
<body>
<div th:if="${param.error}">
    用户名或密码错
</div>
<div th:if="${param.logout}">
    您已注销成功
</div>
<form th:action="@{/login}" method="post">
    <div><label> 用户名 : <input type="text" name="username"/> </label></div>
    <div><label> 密  码 : <input type="password" name="password"/> </label></div>
    <div><input type="submit" value="登录"/></div>
</form>
</body>
</html>

Spring Security提供了一个过滤器来拦截请求并验证用户身份。如果用户身份认证失败,页面就重定向到/login?error,并且页面中会展现相应的错误信息。若用户想要注销登录,可以通过访问/login?logout请求,在完成注销之后,页面展现相应的成功消息。

list.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8"/>
    <title>userList</title>
    <link rel="stylesheet" th:href="@{/css/bootstrap.css}"></link>
</head>
<body class="container">
<br/>
<h1 th:inline="text">Hello [[${#httpServletRequest.remoteUser}]]!</h1>
<h3>用户列表</h3>
<br/><br/>
<div class="with:80%">
    <table class="table table-hover">
        <thead>
        <tr>
            <th>#</th>
            <th>User Name</th>
            <th>Password</th>
            <th>Age</th>
            <th>Edit</th>
            <th>Delete</th>
        </tr>
        </thead>
        <tbody>
        <tr  th:each="user : ${users}">
            <th scope="row" th:text="${user.id}">1</th>
            <td th:text="${user.userName}">neo</td>
            <td th:text="${user.passWord}">Otto</td>
            <td th:text="${user.age}">6</td>
            <td><a th:href="@{/toEdit(id=${user.id})}">edit</a></td>
            <td><a th:href="@{/delete(id=${user.id})}">delete</a></td>
        </tr>
        </tbody>
    </table>
</div>
<div class="form-group">
    <div class="col-sm-2 control-label">
        <a href="/toAdd" th:href="@{/toAdd}" class="btn btn-info">添加</a>
    </div>
</div>
<form th:action="@{/logout}" method="post" >
    <input type="submit" class="btn btn-info" value="注销"/>
</form>
</body>
</html>

UserController中添加请求映射

@RequestMapping(value = "/")
    public String index(){
        return "user/index";
    }
    @RequestMapping(value = "/list")
    public String list(Model model){
        List<User> users = userService.findAll();
        model.addAttribute("users",users);
        return "user/list";
    }
   @RequestMapping(value = "/login",method = RequestMethod.GET)
   public String login(){return "user/login";}

到这里,我们启用应用,并访问http://localhost:8080/,可以正常访问。但是访问http://localhost:8080/list的时候被重定向到了http://localhost:8080/login页面,因为没有登录,用户没有访问权限,通过输入用户名admin和密码123456进行登录后,跳转到了list页面。

原文发布于微信公众号 - 编程坑太多(idig88)

原文发表时间:2018-04-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序猿DD

从零开始的Spring Session(三)

新媒体管家 上一篇文章中,我们使用Redis集成了Spring Session。大多数的配置都是Spring Boot帮我们自动配置的,这一节我们介绍一点Spr...

3068
来自专栏青青天空树

springboot+security整合2

demo下载地址   紧接着上一篇,上一篇中登录验证都由security帮助我们完成了,如果我们想要增加一个验证码登录或者其它的自定义校验就没办法了,因...

3622
来自专栏Kirito的技术分享

Spring Security(五)--动手实现一个IP_Login

在开始这篇文章之前,我们似乎应该思考下为什么需要搞清楚Spring Security的内部工作原理?按照第二篇文章中的配置,一个简单的表单认证不就达成了吗?更有...

39011
来自专栏技术小黑屋

Refused to Execute Script From Because Its MIME Type (Text/plain) Is Not Executable, and Strict MIME

今天又与这个问题相遇了,Orz,还是研究一下解决方法和出现原因吧。 刚刚在github上传了一个js文件,想让这个文件被其他网页引用,于是贴出了这个文件的ra...

2221
来自专栏冷冷

oauth2.0 实现spring cloud nosession

上一篇博客使用自定义jwt实现spring cloud nosession,过程稍微比较复杂,依赖的是我们自己控制token生成、校验。 那么这一篇文章将使用...

45110
来自专栏码匠的流水账

聊聊nginx的几个常见异常

这个通常是proxy_temp目录的owner和group设置不对,导致没有权限

1772
来自专栏凉城

PHP防CC拦截代码,拦截率60%

2038
来自专栏Python自动化测试

python接口测试之401错误的分析和解决(十七)

通过一个案例来分析在HTTP的请求中403错误的解决以及HTTP的状态码中403怎么理解,见发送一个请求后,返回的状态码,见如下的信息:

1916
来自专栏dalaoyang

使用SpringSecurity

2427
来自专栏Ryan Miao

重定向Http status code 303 和 302

http 302 http 303 Http 302 302是一个普通的重定向代码。直观的看来是,请求者(浏览器或者模拟http请求)发起一个请求,然后服务端重...

5125

扫码关注云+社区

领取腾讯云代金券