文档章节

Spring Boot Spring Security Demo

慕容若冰
 慕容若冰
发布于 2016/12/08 20:39
字数 545
阅读 132
收藏 3
点赞 0
评论 0
  1. 新建Spring Boot项目,依赖为JPA,Security,Thymeleaf并tian添加MySQL驱动和Thymeleaf的Spring Security支持
  2. <dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
       <version>5.1.2</version>
    </dependency>
    
    <dependency>
       <groupId>org.thymeleaf.extras</groupId>
       <artifactId>thymeleaf-extras-springsecurity4</artifactId>
    </dependency>
  3. application.properties配置如下
  4. spring.datasource.url = jdbc:mysql://localhost:3306/jpa
    spring.datasource.username = root
    spring.datasource.password =
    spring.datasource.driverClassName = com.mysql.jdbc.Driver
    spring.jpa.hibernate.ddl-auto=update
    spring.jpa.show-sql=true
    spring.jackson.serialization.indent_output=true
    
    logging.level.org.springframework.security=INFO
    spring.thymeleaf.cache=fals
  5. 用户和角色类
    1. /**
       * 用户类
       * Created by Administrator on 2016/12/8.
       */
      @Entity
      public class SysUser implements UserDetails {
      
          private static final long serialVersionUID = 1L;
      
          @Id
          @GeneratedValue
          private Long id;
      
          private String username;
      
          private String password;
      
          //配置用户与角色多对多关系
          @ManyToMany(cascade = {CascadeType.REFRESH}, fetch = FetchType.EAGER)
          private List<SysRole> roles;
      
          //将用户的角色作为权限
          @Override
          public Collection<? extends GrantedAuthority> getAuthorities() {
              List<GrantedAuthority> auths = new ArrayList<GrantedAuthority>();
              List<SysRole> roles = this.getRoles();
              for (SysRole role : roles) {
                  auths.add(new SimpleGrantedAuthority(role.getName()));
              }
              return auths;
          }
      
          @Override
          public boolean isAccountNonExpired() {
              return true;
          }
      
          @Override
          public boolean isAccountNonLocked() {
              return true;
          }
      
          @Override
          public boolean isCredentialsNonExpired() {
              return true;
          }
      
          @Override
          public boolean isEnabled() {
              return true;
          }
  6. 数据访问
  7. package com.spingsecurity.dao;
    
    import com.spingsecurity.entity.SysUser;
    import org.springframework.data.jpa.repository.JpaRepository;
    
    /**
     * Created by Administrator on 2016/12/8.
     */
    public interface SysUserRepository extends JpaRepository<SysUser, Long> {
    
        SysUser findByUsername(String username);
    }
  8. 自定义UserDetailsService
  9. package com.spingsecurity.security;
    
    import com.spingsecurity.dao.SysUserRepository;
    import com.spingsecurity.entity.SysUser;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.security.core.userdetails.UserDetails;
    import org.springframework.security.core.userdetails.UserDetailsService;
    import org.springframework.security.core.userdetails.UsernameNotFoundException;
    
    /**
     * Created by Administrator on 2016/12/8.
     */
    public class CustomUserService implements UserDetailsService {
    
        @Autowired
        SysUserRepository userRepository;
    
        //重写loadUserByUsername方法获得用户
        @Override
        public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
            SysUser user = userRepository.findByUsername(username);
            if (user == null) {
                throw new UsernameNotFoundException("用户名不存在");
            }
            return user;
        }
    }
  10. Spring MVC配置
  11. package com.spingsecurity.config;
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
    
    /**访问/login转向login.html页面
     * Created by Administrator on 2016/12/8.
     */
    @Configuration
    public class WebMvcConfig extends WebMvcConfigurerAdapter {
    
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
            registry.addViewController("/login").setViewName("login");
        }
    }
  12. Spring Security 配置
  13. package com.spingsecurity.config;
    
    import com.spingsecurity.security.CustomUserService;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    import org.springframework.security.core.userdetails.UserDetails;
    import org.springframework.security.core.userdetails.UserDetailsService;
    
    /**
     * Created by Administrator on 2016/12/8.
     */
    @Configuration
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    
        //注册CustomUserService的Bean
        @Bean
        UserDetailsService customUserService() {
            return new CustomUserService();
        }
    
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            //添加自定义的user detail service认证
            auth.userDetailsService(customUserService());
        }
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests()
                    .anyRequest().authenticated()//所有请求需要认证才能访问
                    .and()
                    .formLogin()//定制登陆行为
                        .loginPage("/login")
                        .failureUrl("/login?error")
                        .permitAll()//登录页面可任意访问
                    .and()
                    .logout().permitAll();//定制注销行为,注销请求可任意访问
        }
    }
  14. 控制器
  15. package com.spingsecurity.web;
    
    import com.spingsecurity.entity.Msg;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    /**
     * Created by Administrator on 2016/12/8.
     */
    @Controller
    public class HomeController {
    
        @RequestMapping("/")
        public String index(Model model) {
            Msg msg = new Msg("测试标题", "测试内容", "额外信息,只对管理员显示");
            model.addAttribute("msg", msg);
            return "home";
        }
    }
  16. 运行,访问http://localhost:8080,自动跳转http://localhost:8080/login
  17. 源码:https://git.oschina.net/NeedLoser/Spring-Boot.git

© 著作权归作者所有

共有 人打赏支持
慕容若冰
粉丝 0
博文 43
码字总数 9774
作品 0
广州
程序员
锱铢必较:在spring boot中使用spring security的filter防止CSRF攻击

在一个spring boot项目中,需要防止CSRF攻击,按理说应该集成spring security才对。 但是不想使工程变得太复杂,这时可以只把spring security中的相关filter引入来进行。 在pom中添加相关依赖...

大神带我来搬砖 ⋅ 03/06 ⋅ 0

Spring boot的简单rest服务(非xml方式配置)

背景 简单使用spring boot配置一个rest服务,数据库主要使用mysql没有使用spring演示时候使用的h2(一种内存数据库)和lombok(通过注解的方式生成getter和setter方法,因为要在IDEA上面安装...

亚林瓜子 ⋅ 06/14 ⋅ 0

Spring Boot中Starter是什么

比如我们要在Spring Boot中引入Web MVC的支持时,我们通常会引入这个模块spring-boot-starter-web,而这个模块如果解压包出来会发现里面什么都没有,只定义了一些POM依赖。 经过研究,Start...

easonjim ⋅ 2017/09/30 ⋅ 0

spring boot简单实现rest服务

问题 最开始我是想使用Spring MVC搭建一个简单的REST服务,去官网看了看教程,现在Spring胆越来越大了,需要我集成一个maven的父项目,我并不愿意继承Spring的父项目。然后,就开始下面的探索...

亚林瓜子 ⋅ 06/12 ⋅ 0

Spring Security OAuth Boot 2 Autoconfig

该项目为 Spring Boot 2 和旧的 Spring Security OAuth 项目提供了自动配置,可用于集成 Spring Security OAuth2 和 Spring Boot 2。...

匿名 ⋅ 05/16 ⋅ 0

Spring boot 前后台分离项目 怎么处理spring security 抛出的异常

最近在开发一个项目 前后台分离的 使用 spring boot + spring security + jwt 实现用户登录权限控制等操作。但是 在用户登录的时候,怎么处理spring security 抛出的异常呢?使用了@RestCont...

道可到非常道 ⋅ 05/07 ⋅ 0

Spring、Spring Boot与Spring MVC

总论 Spring框架就像一个家族,有众多衍生产品例如boot、security、jpa等等。但他们的基础都是Spring的ioc和aop。ioc提供了依赖注入的容器,aop解决了面向横切面的编程;然后在此二者的基础上...

临江仙卜算子 ⋅ 05/08 ⋅ 2

Spring Boot 2.0 新特性解读

点击上方“程序员小灰”,选择“置顶公众号” 有趣有内涵的文章第一时间送达! 本文转载自公众号 InfoQ 作者|翟永超编辑|郭蕾Spring Boot 2.0 来啦,有哪些新特性?升级吗?写在前面 北京时...

bjweimengshu ⋅ 04/13 ⋅ 0

Spring Security 的 pac4j 安全库 - spring-security-pac4j

spring-security-pac4j 项目是 Spring Security(带或不带 Spring Boot)Web 应用程序的简单而强大的安全库。 它支持身份验证和授权,还支持会话固定和 CSRF 保护等高级功能,它基于 Java 8...

匿名 ⋅ 05/16 ⋅ 0

深入 Spring Boot :实现对 Fat Jar jsp 的支持

原文出处:Hengyunabc spring boot 对于jsp支持的限制 对于jsp的支持,Spring Boot官方只支持了war的打包方式,不支持fat jar。参考官方文档: https://docs.spring.io/spring-boot/docs/cu...

Hengyunabc ⋅ 06/04 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

在树莓派上搭建一个maven仓库

在树莓派上搭建一个maven仓库 20180618 lambo init 项目说明 家里有台树莓派性能太慢。想搭建一个maven私服, 使用nexus或者 jfrog-artifactory 运行的够呛。怎么办呢,手写一个吧.所在这个...

林小宝 ⋅ 15分钟前 ⋅ 0

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 47分钟前 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 今天 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 今天 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 今天 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

到底会改名吗?微软GVFS 改名之争

微软去年透露了 Git Virtual File System(GVFS)项目,GVFS 是 Git 版本控制系统的一个开源插件,允许 Git 处理 TB 规模的代码库,比如 270 GB 的 Windows 代码库。该项目公布之初就引发了争...

linux-tao ⋅ 今天 ⋅ 0

笔试题之Java基础部分【简】【二】

1.静态变量和实例变量的区别 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变...

anlve ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部