Spring Security框架
为基于Spring的企业应用系统提供声明式的安全訪问控制解决方式的安全框架,应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分。
1、创建pom.xml文件
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.seasy</groupId> <artifactId>springmvc-test</artifactId> <version>1.0.0</version> <packaging>war</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.8.RELEASE</version> </parent> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- spring security --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <!-- 解析jsp文件:Springboot内嵌的Tomcat默认不支持jsp --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </dependency> </dependencies> <build> <finalName>springboot-test</finalName> </build> </project>
2、创建UserDetails实现类
public class UserDetailsImpl implements UserDetails { private String username; private String password; private List<GrantedAuthority> authorities = new ArrayList<>(); public UserDetailsImpl(String username, String password, List<GrantedAuthority> authorities){ this.username = username; this.password = password; this.authorities = authorities; } @Override public Collection<? extends GrantedAuthority> getAuthorities() { return authorities; } @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; } }
3、创建UserDetailsService实现类
@Component public class UserDetailsServiceImpl implements UserDetailsService { /** * 根据用户名获取对应的用户信息 */ @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { String password = username; UserDetailsImpl user = new UserDetailsImpl(username, password, AuthorityUtils.commaSeparatedStringToAuthorityList(username)); return user; } }
4、创建AuthenticationProvider实现类
@Component public class DefaultAuthenticationProvider implements AuthenticationProvider { @Autowired private UserDetailsService userDetailsService; @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { //登录输入的信息 String username = (String) authentication.getPrincipal(); String password = (String) authentication.getCredentials(); //用户信息合法性认证 UserDetailsImpl userDetails = (UserDetailsImpl) userDetailsService.loadUserByUsername(username); if (userDetails == null) { throw new UsernameNotFoundException("用户名不存在"); } if (!userDetails.getPassword().equals(password)) { throw new BadCredentialsException("密码不正确"); } //授权信息 Collection<? extends GrantedAuthority> authorities = userDetails.getAuthorities(); return new UsernamePasswordAuthenticationToken(userDetails, password, authorities); } @Override public boolean supports(Class<?> authentication) { return true; } }
5、创建WebSecurityConfigurerAdapter类的子类
@Configuration @EnableWebSecurity(debug=true) public class WebSecurityConfig extends WebSecurityConfigurerAdapter{ private static final String LOGIN_PAGE = "/login.jsp"; private static final String LOGIN_FAILURE_PAGE = "/login.jsp?error=Y"; @Autowired private AuthenticationProvider provider; @Autowired private AccessDeniedHandler accessDeniedHandler; /** * 认证 */ @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { //添加自定义的认证提供者 auth.authenticationProvider(provider); } /** * 授权 */ @Override protected void configure(HttpSecurity http) throws Exception { //permitAll: 表示不登录也可以访问 //登录 http.formLogin() .loginPage(LOGIN_PAGE) .loginProcessingUrl("/login") //要与登录页面的form表单的action值一致 .failureUrl(LOGIN_FAILURE_PAGE) //登录失败的回调页面 .defaultSuccessUrl("/main") .permitAll(); //授权 http.authorizeRequests() .antMatchers("/static/**", "/js/**", "/css/**", "/images/**").permitAll() .antMatchers("/test/**").hasAnyAuthority("test") .antMatchers("/admin/**").hasAnyAuthority("admin") //hasAnyAuthority不需要ROLE_前缀 .anyRequest() .authenticated(); //访问拒绝处理器 http.exceptionHandling() .accessDeniedHandler(accessDeniedHandler); //退出 http.logout() .logoutRequestMatcher(new AntPathRequestMatcher("/logout")) .logoutSuccessUrl(LOGIN_PAGE) .invalidateHttpSession(true) .permitAll(); //关闭 跨域伪造请求限制 http.csrf().disable(); //关闭 跨域资源共享限制 http.cors().disable(); } /** * 密码编码器 */ @Bean public PasswordEncoder passwordEncoder(){ return new BCryptPasswordEncoder(); } }
6、访问拒绝处理器
@Component public class DefaultAccessDeniedHandler implements AccessDeniedHandler { private String error403 = "/WEB-INF/views/error403.jsp"; @Override public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException { if (RequestUtil.isAjaxRequest(request)) { response.sendError(403); } else if (!response.isCommitted()) { if(StringUtil.isNotEmpty(error403)){ //重定向到错误页面 request.setAttribute(WebAttributes.ACCESS_DENIED_403, accessDeniedException); response.setStatus(HttpServletResponse.SC_FORBIDDEN); request.getRequestDispatcher(error403).forward(request, response); }else{ response.sendError(HttpServletResponse.SC_FORBIDDEN, accessDeniedException.getMessage()); } } } }
7、登录页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登录页面</title> </head> <body> <h2>自定义登录页面</h2> <form action='<c:url value="/login"/>' method="post"> <table> <tr> <td>用户名:</td> <td><input type="text" name="username"></td> </tr> <tr> <td>密码:</td> <td><input type="password" name="password"></td> </tr> <tr> <td colspan="2"> <button type="submit">登录</button> </td> </tr> </table> error=${param.error}<br> </form> </body> </html>
8、403异常页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <html> <head> <meta charset="UTF-8"> <title>error 403</title> </head> <body> 访问出错403:<br> ${requestScope.SPRING_SECURITY_403_EXCEPTION} </body> </html>
9、登录认证成功后的显示首页
Controller类
@Controller public class MainController{ @GetMapping("/main") public String main(){ return "main"; } }
首页main.jsp页面:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> 首页<br> <a href='<c:url value="/logout"/>'>退出</a><br><br> </body> </html>
10、application.properties属性文件
spring.application.name=springmvc-test server.port=8888 server.servlet.context-path=/mvctest #spring mvc spring.mvc.view.prefix=/WEB-INF/views/ spring.mvc.view.suffix=.jsp
11、启动类
@SpringBootApplication() public class Main{ public static void main(String[] args){ SpringApplication springApplication = new SpringApplication(Main.class); springApplication.run(args); } }
相关推荐
SpringBoot之整合Spring Security,SpringBoot之整合Spring SecuritySpringBoot之整合Spring SecuritySpringBoot之整合Spring Security
本项目集成了springboot+security+mybatis+redis+jwt用于学习security鉴权功能,其中有集成了redis,mybatis,jasypt,jwt,thymeleaf,knife4j,mybatis-plus 项目搭建已经比较成熟,能够直接进行使用,通过代码...
4.权限管理框架-----spring-security 5.监控框架---------actuator、remote-shell 6.日志-------------logback 7.前台框架---------thymeleaf 8.生成工具---------generator(自动生成bean、mapper、SQL) 9.分页...
Spring Security是一个功能强大且高度可定制的身份验证和...这篇文章就是想通过一个小案例将Spring Security整合到SpringBoot中去。要实现的功能就是在认证服务器上登录,然后获取Token,再访问资源服务器中的资源。
SpringBoot+Mybatis+SpringSecurity+Bootstrap+Layui开发java web轻量级小巧视频网站系统 项目描述 PC端+手机端模式自适应 支持本地资源视频文件上传在线播放,同时支持在线资源链接上传(ed2k、迅雷、等资源)...
该资源包整合基于springboot整合springsecurity结合jwt做权限验证、配置完善,可以直接作为项目的基础框架集成使用,使用mybatis作为持久层框架,基础框架搭建完成,只需要写业务代码集合,便于快捷开发。
基于RBAC模型构建权限管理模块,并集成安全框架SpringSecurity,实现用户的认证和授权。 使用Spring Data集成缓存中间件Redis,加快访问速度。 使用Spring Data集成全文搜索搜索引擎ElasticSearch,实现文章信息的...
早一段时间学习了springsecurity3.0 框架,在开始阶段不知道导入那些必需jar包,经过摸索,总结出来最精简的jar包
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。这篇文章主要介绍了SpringBoot2.0 整合 SpringSecurity 框架,实现用户权限安全管理 ,需要的朋友可以参考下
本资源通过SpringBoot整合SpringSecurity框架,实现对用户的认证授权功能,其中写了多个小demo,并且对SpringSecuirty进行了相应的配置,读者通过本资源可以得到关于SpringSecurity的认证授权知识,以及相关的流程。
一般来说中大型的项目都是使用SpringSecurity来做安全框架。小项目有Shiro的比较多,因为相比与SpringSecurity,Shiro的上手更加的简单。 一般Web应用的需要进行认证和授权。 认证:验证当前访问系统的是不是本...
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean。
这个项目是基于SpringBoot + SpringSecurity + SpringSocial + JWT方式的第三方登录和安全认证框架 包括APP +浏览器端的实现 学习的笔记和引导都在我的csdn博客更新中,有任何问题都可以问博主。 CSDN地址: :
springBoot整合security附表结构sql脚本
使用SSM框架(SpringBoot、SpringSecurity、MyBatis)开发的一个简单校园多商家食堂点餐平台,可用于毕业设计。 1:在linux下使用docker安装好了redis 并且在项目test类下成功向Linux虚拟机的redis里写入了数据; 2:...
SpringBoot + SpringSecurity + Thymeleaf 入门案例,适合快速整合权限管理框架的同学,可以快速进行修改源代码实现权限控制的效果。代码是入门案例,较为简单。能够使整合更加迅速。其中搭配了前端页面进行效果显示...
springboot之SpringSecurity-这里可以取到SpringBoot之----如何整合SpringSecurity框架之认证和授权源码,教程在我的文章里面。
Java开发人员在解决Web应用安全相关的问题时,通常会采用两个非常流行的安全框架,Shiro和SpringSecurity。Shiro配置简单,上手快,满足一般应用的安全需求,但是功能相对单一。SpringSecurity安全粒度细,与Spring...
需求: 同样的查询条件,查询不同的表 要求: 所有的表都要有相同的字段 技术:灵活可扩展,方便上手,boot框架,简化...查询的数据封装在List中,转换map之后,在将数据转成XML 返回; 项目中包含面向切面日志的处理;