这章我们来学习下springsecurity中的基础配置美高梅

美高梅游戏网站登录 1cover上一章我们从源码角度探究了springboot对于帮我们初始化的springsecurity默认配置,这章我们来学习下springsecurity中的基础配置

美高梅游戏网站登录 2cover上一章我们详细介绍了springsecurity的基础结构,并且在第三章我们已经知道了springsecurity中的基础配置,但是那是基于all in one模式的,前端页面和后端集成在一起,然而事实上现在越来越多的开发模式是前后端分离,后端提供的restful接口,那我们本章就来学习下springsecurity+jwt整合restful服务。

美高梅游戏网站登录 3security

springboot整合springsecurity系列文章:springboot整合springsecurity从Hello World到源码解析:hello world程序入门springboot整合springsecurity从Hello World到源码解析:springsecurity配置加载解析springboot整合springsecurity从Hello World到源码解析:基础配置详解springboot整合springsecurity从Hello World到源码解析:springsecurity基础架构解析springboot整合springsecurity从Hello World到源码解析:springsecurity+jwt整合restful服务

springboot整合springsecurity系列文章:springboot整合springsecurity从Hello World到源码解析:hello world程序入门springboot整合springsecurity从Hello World到源码解析:springsecurity配置加载解析springboot整合springsecurity从Hello World到源码解析:基础配置详解springboot整合springsecurity从Hello World到源码解析:springsecurity基础架构解析springboot整合springsecurity从Hello World到源码解析:springsecurity+jwt整合restful服务

摘要:权限控制在我们的项目当中一般都有用到,有简单的登录就搞定的权限访问,也有分级身份的权限控制,而权限控制的方式对于不同的需求也有多种选择,小到使用代码硬编码,自定义过滤器,自定义拦截器等等。更加灵活的方式则是使用已有的权限工具。如shiro,springsecurity等。而本系列博客将重点介绍springsecurity的工作原理以及应用。

springsecurity的官方介绍:Spring Security是一个功能强大且可高度自定义的身份验证和访问控制框架。它是保护基于Spring的应用程序的框架。Spring Security是一个专注于为Java应用程序提供身份验证和授权的框架。与所有Spring项目一样,Spring Security的真正强大之处在于它可以轻松扩展以满足自定义要求

- 上一章我们已经知道,springsecurity中所有配置基本都来源于一个默认的WebSecurityConfigurerAdapter,那我们首先写一个类继承它,放弃springboot帮我们做的默认配置,叫SecurityConfig,为了看到更多的配置,我们加上一个注解(其实springboot已经帮我们加上),@EnableWebSecurity(debug

true),修改debug位true,然后打开我们的配置文件application.yml,修改spring的log信息为debug,如下:
server: port: 8080spring: freemarker: enabled: true cache: false template-loader-path: classpath:/templates/ suffix: .html security: user: name: user password: admin roles: user, adminlogging: level: org.springframework.*: debug
  • 打开SecurityConfig,首先明确我们的目的:修改原来的登陆页面,登陆成功后,跳转到我们的hello页面,所以首先添加登陆页面login.html,并且添加视图解析(和第一章一样添加controller同样效果):
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>login page</title></head><body>This is login page from jsbintask<form action="/login" method="post"> username: <input name="username" /><br/> password: <input name="password" /><br/> <button type="submit">submit</button></form></body></html>

这里请记住这个表单提交的地址/login,写一个类WebMvcConfig实现WebMvcConfigurer(2.0以前需要继承WebMvcConfigurerAdapter),添加如下配置:

@Configuration@EnableWebMvcpublic class WebMvcConfig implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController.setViewName; } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { }}
  • 接着继续回来SecurityConfig,首先覆盖下原方法configure(HttpSecurity http),我们看下原来实现是什么:
protected void configure(HttpSecurity http) throws Exception { logger.debug("Using default configure(HttpSecurity). If subclassed this will potentially override subclass configure(HttpSecurity)."); http .authorizeRequests() .anyRequest().authenticated .formLogin .httpBasic(); }

可以看出,默认配置就是所有页面全部被拦截,开启登陆表单验证以及http basic验证,我们继续查看formLogin()方法:

public FormLoginConfigurer<HttpSecurity> formLogin() throws Exception { return getOrApply(new FormLoginConfigurer<>; }

熟悉的apply方法,上一章已经介绍,这是添加拦截器,FormLoginConfigurer如下:

public FormLoginConfigurer() { super(new UsernamePasswordAuthenticationFilter; usernameParameter("username"); passwordParameter("password"); }

加了一个UsernamePasswordAuthenticationFilter拦截器。接下来,我们修改configure配置如下,值得注意的是,因为现在我们的页面是自己的定义,但是所有页面都是需要权限的,所以我们必须放行登陆(error页面在BaseErrorController中定义),错误页面:

@Overrideprotected void configure(HttpSecurity http) throws Exception { http.formLogin() .loginPage // 和login.html中表单提交的一直必须一样,这样才能让springsecurity帮你处理请求 .loginProcessingUrl .and() .authorizeRequests() .antMatchers("/index", "/login", "/error").permitAll() .anyRequest() .authenticated();}

接着启动项目,查看控制台,发现多个springsecurity的日志:o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@60d40ff4, org.springframework.security.web.context.SecurityContextPersistenceFilter@58867cd5, org.springframework.security.web.header.HeaderWriterFilter@2c05ff9d, org.springframework.security.web.csrf.CsrfFilter@44ed0a8f, org.springframework.security.web.authentication.logout.LogoutFilter@70211df5, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@4c5228e7, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@5a8ab2, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@71926a36, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@2e5b7fba, org.springframework.security.web.session.SessionManagementFilter@2e1ddc90, org.springframework.security.web.access.ExceptionTranslationFilter@2687725a, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@c29fe36]看得出这就是我们上一章说的过滤器链了。并且UsernamePasswordAuthenticationFilter也在其中接下来打开浏览器,直接访问主界面,

美高梅游戏网站登录 4security然后点击提交,发现403错误了,纳尼? 赶紧检查控制台,发现走了一个CrsfFilter,这个filter需要一个参数,防止xss攻击的,但是我们不需要,所以我们禁掉,如下:

@Overrideprotected void configure(HttpSecurity http) throws Exception { http.formLogin() .loginPage .loginProcessingUrl .and() .authorizeRequests() .antMatchers("/index", "/login", "/error", "/favicon.ico").permitAll() .anyRequest() .authenticated .csrf() .disable();}

这回正常了,我们输入错误的用户名,密码,果然,回到了原来的登陆页面,如下:

美高梅游戏网站登录 5security并且后面带了一个error的参数,所以如果我们的login页面再做下处理,就能回显用户名密码错误了。然后我们继续输入我们一开始已经配置用户名密码,继续,这回出现了404,美高梅游戏网站登录 6security看地址我们知道它是登陆成功后帮我回到了

@Overrideprotected void configure(HttpSecurity http) throws Exception { http.formLogin() .loginPage .loginProcessingUrl .successForwardUrl .and() .authorizeRequests() .antMatchers("/index", "/login", "/error", "/favicon.ico").permitAll() .anyRequest() .authenticated .csrf() .disable();}

继续登陆,果然,成功后帮我们重定向到了hello页面:

美高梅游戏网站登录 7security

经过上面的配置,我们一开始的目的达到了,自定义登陆页面,并且登陆成功后跳转到主界面,但是现在还有个问题是,我们的用户名密码是配置配置文件中的,这样肯定不行,因为我们一般都是使用数据库的。接下来就是我们自定义数据源了。

上一篇博客我们已经通过源码分析了springboot在启动的时候帮我们初始化了一个在内存中的UserDetailService,如下:

美高梅游戏网站登录 8security那我们现在先来覆盖掉这个,回到先前的SecurityConfig,并且继承方法configure(AuthenticationManagerBuilder auth),在自定义UserDetailsService的时候,发现它要求返回一个UserDetails,所以我们需要继承这个类来返回自己的实体类User,因为我们这里使用内存中的实现,可以直接用它提供的工具方法:

@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(new InMemoryUserDetailsManager( User.builder().username("jsbintask1").password("{noop}123456").authorities("jsbintask1").build(), User.builder().username("jsbintask2").password("{noop}123456").authorities("jsbintask2").build;}

值得注意的是,如果我们以这种方式定义密码的时候,要在密码前面加上{noop}这个前缀或者配置一个密码加密器的bean,否则验证会出错。另外还有一点就是一定要添加roles或者authorities,否则springsecurity不予通过。现在我们重新登陆,并且使用一开始配置文件中的用户名密码,发现此时已经不行了。 再用我们的新用户名密码,通过!

美高梅游戏网站登录 9security

到这里,我们的自定义内存中的数据源就定义好了,接下来我们换成数据库中的形式。

  • 因为要使用数据库,那我们就选用spring-data jpa去操作数据库,首先引入依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId></dependency>

接下来就是配置mysql数据源和hibernate的属性了:

spring: datasource: driver-class-name: com.mysql.jdbc.Driver username: root password: jason url: jdbc:mysql://localhost:3306/springsecurity_demos?useSSL=false jpa: show-sql: true hibernate: ddl-auto: update properties: hibernate: format_sql: true

初始化sql脚本如下:

CREATE DATABASE springsecurity_demos;USE springsecurity_demos;SET NAMES utf8mb4;SET FOREIGN_KEY_CHECKS = 0;-- ------------------------------ Table structure for role-- ----------------------------DROP TABLE IF EXISTS `role`;CREATE TABLE `role` ( `id` int NOT NULL AUTO_INCREMENT, `role_name` varchar CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `description` varchar CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, PRIMARY KEY  USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;-- ------------------------------ Records of role-- ----------------------------INSERT INTO `role` VALUES (1, 'user', 'this is a user role.');INSERT INTO `role` VALUES (2, 'admin', 'this is a admin role.');-- ------------------------------ Table structure for user-- ----------------------------DROP TABLE IF EXISTS `user`;CREATE TABLE `user` ( `id` int NOT NULL AUTO_INCREMENT, `username` varchar CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `password` varchar CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `age` int NULL DEFAULT NULL, `address` varchar CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `role_id` int NOT NULL, PRIMARY KEY  USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;-- ------------------------------ Records of user-- ----------------------------INSERT INTO `user` VALUES (1, 'jsbintask', '$2a$10$WfUOGFJzAkPeRU3ZK2q6v.FNFcgIBrhixFNQ/htTKx71RK/OBMYaC', 22, 'China, Wuhan', 0);SET FOREIGN_KEY_CHECKS = 1;

我们的数据库一共有两张表,user表和role表,此处为了简单,我们的user和role设为1对多关系,user表中添加role_id,然后编写User, Role实体类,UserRepository, RoleRepository:

@Table@Entity@Datapublic class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String username; private String password; private Integer age; private String address; private Integer roleId;}@Repositorypublic interface UserRepository extends JpaRepository<User, Integer> { User findByUsername(String username);}@Entity@Table@Datapublic class Role { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String roleName; private String description;}@Repositorypublic interface RoleRepository extends JpaRepository<Role, Integer> {}

好了,接下就是要与sprinsecurity结合了,在此之前,还有一点需要我们明白,springsecurity中对于用户的表示有自己的实体类相对应,它就是UserDetails,所以我们编写一个AuthUser实现这个接口:

@Data@AllArgsConstructor@NoArgsConstructorpublic class AuthUser implements UserDetails { private String username; private String password; private List<Role> roles; @Override public Collection<? extends GrantedAuthority> getAuthorities() { return roles.isEmpty() ? Collections.EMPTY_LIST : (roles.parallelStream().map(role -> new SimpleGrantedAuthority(role.getRoleName.collect(Collectors.toList; } @Override public String getPassword() { return password; } @Override public String getUsername() { return username; } @Override public boolean isAccountNonExpired() { return true; } @Override public boolean isAccountNonLocked() { return true; } @Override public boolean isCredentialsNonExpired() { return true; } @Override public boolean isEnabled() { return true; }}

其中关于账号过期,enable全部设置为通过,接下来就是编写CustomUserDetailsService,返回我们自己的AuthUser:

@Service@Primarypublic class CustomUserDetailsServiceImpl implements UserDetailsService { @Resource private UserRepository userRepository; @Resource private RoleRepository roleRepository; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User user = userRepository.findByUsername; if (user == null) { throw new UsernameNotFoundException("user: " + username + " is not found."); } return new AuthUser(user.getUsername(), user.getPassword(), roleRepository.findAllById(Collections.singletonList(user.getRoleId; }}

注意,此处如果没有找到用户,要抛出 UsernameNotFoundException,然后springsecurity会处理。到此,其实我们的UserDetails已经注入了Spring中, what? 不是还只定义了吗,其实我们加上@Service和@Primary之后,springsecurity就能自己检测到这个bean,然后作为自己的UserDetailsService,当然,如果我们像上面一样使用覆盖方法的方式同样可行。 但是接下来还有差一步,我们上面已经说到了,再springsecurity中一定要对密码进行处理,比如我们上面就是不加密,在前面加上{noop},这里我们不这里处理,我们配置一个密码加密器:

@Beanpublic BCryptPasswordEncoder bCryptPasswordEncoder() { return new BCryptPasswordEncoder();}

同样,springsecurity也能检测到,这样定义就ok了,那这样就有另一个问题了,我们的密码是加密过了,所以我们的数据库初始化一个加密过的密码才行,所以我们再使用这个加密器生成一个密码“123456”:

public static void main(String[] args) { BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder(); System.out.println(bCryptPasswordEncoder.encode);}

然后将密码放入数据库。然后同样去登陆,输入数据库中用户名,密码,同样帮我们转发了主页面hello,至此,我们的db中的数据源定义也同样通过了!

源码地址(麻烦点个star哦):

本次我们手把手操作并且总结了springsecurity的一般用法,并且提出了很多值得注意的点。 那么接下来我们就站在一个高一点角度来分析一下springsecurity的架构吧。

本文原创地址:

首先我们先了解下什么是jwt,jwt全称是json web tokens,它是基于RFC 7519开放标准用于双方安全展示信息的一种方式。通俗说就是是用于服务端和客户端相互交换信息的一种凭证。这个凭证我们就叫token,在传统的认证模式中,我们普遍的做法是这样的:用户登录-》服务端生成session-》写入sessionId到cookie-》浏览器携带该session访问服务端-》服务器基于该sessionId查找信息-》认证通过这种做法存在如下问题:

从上面的介绍我们知道,spring security是基于spring框架的,所以与spring基本无缝集成,而本系列博客也将使用最新的springboot(没接触过的可以先学习springboot系列教程)进行演示,好了,说了这么多废话,接下来看hello world的入门搭建。

  1. 服务端需一定资源保存session信息,用户多时资源消耗较大
  2. 扩展性不好,当我们的服务端需要集群时,因session保存在服务端,此时无法定位session,造成登录失效(传统解决办法:iphash,session写入redis等)
  3. 跨域问题,当我们访问A网站时,此时不想再登录就能够访问关联网站B。(传统解决办法:写入持久层,A,B同时访问)虽然上面面对的问题我们普遍都有解决办法,但是显然都不怎么 ”友好“,所以这个时候就有一种干脆的解决办法了,服务端不再保存session,这样就轻松解决了上面所有问题。服务端只颁发token,那么现在的流程变成了这样:用户登录-》服务端颁发token-》客户端保存token(放入cooken或者header)-》携带token访问服务端-》服务端验证token-》调用api-》获取信息那么既然是服务端颁发的token,那肯定要保证该token的安全(只有该服务端颁发的token才认),唯一,而jwt则是用来生成这个安全的token的。 jwt的组成如下:

springboot整合springsecurity系列文章:springboot整合springsecurity从Hello World到源码解析:hello world程序入门springboot整合springsecurity从Hello World到源码解析:springsecurity配置加载解析springboot整合springsecurity从Hello World到源码解析:基础配置详解springboot整合springsecurity从Hello World到源码解析:springsecurity基础架构解析springboot整合springsecurity从Hello World到源码解析:springsecurity+jwt整合restful服务

  • header,保存算法,类型
  • payload,用户的信息,如id,用户名等等
  • signature,将生成的token编码他们之间用 "."号隔开,例如:xxxxx.yyyyy.zzzzz

    美高梅游戏网站登录 10token

基础环境,springboot: 2.1.1.RELEASE注意,因为本项目演示有多个,所以我把他们构建成了多个子项目。父pom文件:

我们知道,在restful服务中,服务端不再直接生成页面了,而是只返回数据,客户端渲染,而我们前面的例子已经知道了springsecurity默认也是直接生成整个页面的,所以这里的关键就成了我们需要自己定义返回数据形式了,主要是错误处理,那我们接下来就开始实践。

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <packaging>pom</packaging> <modules> <module>basic-security</module> </modules> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>cn.jsbintask</groupId> <artifactId>spring-security-demos</artifactId> <version>1.0.0</version> <name>spring-security-demos</name> <description>Demos project for Spring Security</description> <properties> <java.version>1.8</java.version> </properties></project>

新建一个springboot项目,pom文件如下:

hello-world版本pom文件:

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>spring-security-demos</artifactId> <groupId>cn.jsbintask</groupId> <version>1.0.0</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>security-jwt-restful</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- jwt --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> </dependencies></project>
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <groupId>cn.jsbintask</groupId> <artifactId>spring-security-demos</artifactId> <version>1.0.0</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>basic-security</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>

定义数据源,application.yml文件以及sql脚本如下:

注意上方引入了lombok和freemarker,主要为了演示方便。

server: port: 8080spring: datasource: driver-class-name: com.mysql.jdbc.Driver username: root password: jason url: jdbc:mysql://localhost:3306/springsecurity_demos?useSSL=false jpa: show-sql: true hibernate: ddl-auto: update properties: hibernate: format_sql: truelogging: level: org.springframework.*: debug

1. 环境搭建好后,接下来开始编写helloworld程序,首先编写一个freemarker模板(不知道的可以当作html处理)hello.html放到templates目录下方

sql脚本如下,本例我们了简单,密码使用明文:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>hello</title></head><body> <h2>hello world from jsbintask.</h2></body></html>
CREATE DATABASE springsecurity_demos;USE springsecurity_demos;SET NAMES utf8mb4;SET FOREIGN_KEY_CHECKS = 0;-- ------------------------------ Table structure for role-- ----------------------------DROP TABLE IF EXISTS `role`;CREATE TABLE `role` ( `id` int NOT NULL AUTO_INCREMENT, `role_name` varchar CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `description` varchar CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, PRIMARY KEY  USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;-- ------------------------------ Records of role-- ----------------------------INSERT INTO `role` VALUES (1, 'user', 'this is a user role.');INSERT INTO `role` VALUES (2, 'admin', 'this is a admin role.');-- ------------------------------ Table structure for user-- ----------------------------DROP TABLE IF EXISTS `user`;CREATE TABLE `user` ( `id` int NOT NULL AUTO_INCREMENT, `username` varchar CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `password` varchar CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `age` int NULL DEFAULT NULL, `address` varchar CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `role_id` int NOT NULL, PRIMARY KEY  USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;-- ------------------------------ Records of user-- ----------------------------INSERT INTO `user` VALUES (1, 'jsbintask', '123456', 22, 'China, Wuhan', 1);SET FOREIGN_KEY_CHECKS = 1;
  1. 修改application.yml

    server: port: 8080spring: freemarker: enabled: true cache: false template-loader-path: classpath:/templates/ suffix: .html security: user: name: user password: admin roles: user, admin

接着定义实体类domain,repository等,参考之前的博客,值得注意的是,此处我们的AuthUser稍有不同:

上方配置先不进行讲解,下章解析工作原理时会着重进行讲解,各位可以先跟着配置。

@Data@AllArgsConstructor@NoArgsConstructorpublic class AuthUser implements UserDetails { private String username; private String password; private List<Role> roles; @Override public Collection<? extends GrantedAuthority> getAuthorities() { return roles.isEmpty() ? Collections.EMPTY_LIST : // ROLE_ 是springsecurity对于角色的默认前缀,如果不加,验证会失败 (roles.parallelStream().map(role -> new SimpleGrantedAuthority("ROLE_" + role.getRoleName.collect(Collectors.toList; } @Override public String getPassword() { return password; } @Override public String getUsername() { return username; } @Override public boolean isAccountNonExpired() { return true; } @Override public boolean isAccountNonLocked() { return true; } @Override public boolean isCredentialsNonExpired() { return true; } @Override public boolean isEnabled() { return true; }}
  1. 编写controller

    @Controller@RequestMappingpublic class HelloController { @RequestMapping public String hello(ModelAndView mv) { return "hello"; }}

本文由美高梅游戏网站登录发布于美高梅棋牌游戏,转载请注明出处:这章我们来学习下springsecurity中的基础配置美高梅

您可能还会对下面的文章感兴趣: