当前位置: 首页 > news >正文

桃园市网站建设_网站建设公司_MongoDB_seo优化

电子商务网站建设方式,济南建设集团有限公司,网站seo优化8888,网站推广渠道有哪些前言至于什么是Spring security #xff0c;主要两个作用#xff0c;用户认证和授权。即我们常说的#xff0c;用户只有登录了才能进行其他操作#xff0c;没有登录的话就重定向到登录界面。有的用户有权限执行某一操作#xff0c;而有的用户不能执行则是授权。算是一个项…前言至于什么是Spring security 主要两个作用用户认证和授权。即我们常说的用户只有登录了才能进行其他操作没有登录的话就重定向到登录界面。有的用户有权限执行某一操作而有的用户不能执行则是授权。算是一个项目安全框架。和shiro 框架一样。二者的不同大家可以百度小。Spring security 是Spring家族的一员所以Springboot算是对Spring security 进行的天然的支持。之所以这样说spring security 被人诟病的配置繁琐复杂在springboot中变的简单起来。如果我们只是demo 效果可以做到0配置实现。下面我们就一起来见识一下吧依赖我们在pom.xml 文件中引入Spring security 的statterdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-security/artifactId /dependency dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId /dependency测试我们先来0配置的看看。引入依赖以后我们创建一个HelloController 内容如下RestController public class HelloController {RequestMapping(/hello)public String hello(){return hello world;} }然后我们启动项目按照我们正常的理解直接访问localhost:8080/hello 会返回hello world 。但结果却是重定向到了/login 。下面的界面是Spring security 自带的。其实上面可以看到Spring security 已经起作用了没有登录不能访问 /hello 接口。默认的用户名为 user;密码在我们项目启动时控制台有打印每次都会不一样随机生成的。我们输入账号密码再试试可以看到在登录之后我们在请求 /hello 会直接返回hello world , 那是不是只要登录一次后面就可以一直访问呢当然不是的登录成功之后会将信息保存在session 中再登录的时候就会通过session 校验这样就可以访问到了当session过期获取我们手动清理掉后就需要重新登录了。我们来试试。打开控制台application 中的cookies 中的jsessionid 清理掉。我们接着请求试试可以发现删除后就会重新回到登录界面。简单配置用户和密码上面我们使用的默认的用户名和密码但是实际上我们肯定不会这么做的上面只是说明springboot 完全的集成了Spring security 。下面我们先来简单的配置用户名密码之所以这样说因为我们实际过程中应该还是不会这么用的。之所以要讲让大家了解的更全面也为下面铺垫。application.properties 中配置首先我们来简单的我们可以直接在application.properties 中配置用户名和密码。来代替默认用户名和密码的效果。spring.security.user.namequellanan spring.security.user.password123456 spring.security.user.rolesadmin分别是设置用户名密码角色。我们这里暂时只用了用户认证所以角色设不设置无所谓。配置好这些之后我们重启项目在界面上试试再。没有问题但是没有什么用我们实际中是不会这么干的吧。内存中配置在内存中配置的话相对来说要复杂点我们创建一个config 包在包下创建SecurityConfig 类继承 WebSecurityConfigurerAdapterConfiguration public class SecurityConfig extends WebSecurityConfigurerAdapter {Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().passwordEncoder(passwordEncoder()) // 指定加密方式.withUser(qaz).password(passwordEncoder().encode(123456)).roles(admin).and().withUser(test).password(passwordEncoder().encode(123456)).roles(USER);}Beanpublic PasswordEncoder passwordEncoder() {// BCryptPasswordEncoderSpring Security 提供的加密工具return new BCryptPasswordEncoder();} }这里我们重写了configure(AuthenticationManagerBuilder auth) 方法就是将定义的用户配置到内存中。这里有一个问题需要说明一下就是这里配置的话密码需要用BCryptPasswordEncoder 加密。如果不加密的话项目编译启动不会报错但是登陆的时候就会提示账号密码错误。还有一个问题就是如果我们在这配置了那我们在application.peoperties 中配置的就会失效。上面说的这两种方法其实都是不常用的我们在实际项目中根本不会在项目中写死用户信息的。基本上都是存在数据库中。所以下面我们就开始讲解我们最常用的模式吧。由于这一类涉及的较多就单独一级标题出来不放在二级标题里面了。从数据库进行用户认证既然是用到数据库项目中自然要引入数据的配置啦我这里用的是mysql 和mybatis.这是整个项目成型后的目录结构先放出来大家心里有底然后一步一步的来。建库建表简单的三张表user,roles,roles_user 。下面是 sql。直接执行就可以/* Date: 2017-12-26 18:36:12 */CREATE DATABASE quellanan DEFAULT CHARACTER SET utf8;USE quellanan;SET FOREIGN_KEY_CHECKS0;-- ---------------------------- -- Table structure for roles -- ---------------------------- DROP TABLE IF EXISTS roles; CREATE TABLE roles (id int(11) NOT NULL AUTO_INCREMENT,name varchar(32) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT6 DEFAULT CHARSETutf8;-- ---------------------------- -- Records of roles -- ---------------------------- INSERT INTO roles VALUES (1, 超级管理员); INSERT INTO roles VALUES (2, 普通用户); INSERT INTO roles VALUES (3, 测试角色1); INSERT INTO roles VALUES (4, 测试角色2); INSERT INTO roles VALUES (5, 测试角色3);-- ---------------------------- -- Table structure for roles_user -- ---------------------------- DROP TABLE IF EXISTS roles_user; CREATE TABLE roles_user (id int(11) NOT NULL AUTO_INCREMENT,rid int(11) DEFAULT 2,uid int(11) DEFAULT NULL,PRIMARY KEY (id),KEY rid (rid),KEY roles_user_ibfk_2 (uid),CONSTRAINT roles_user_ibfk_1 FOREIGN KEY (rid) REFERENCES roles (id),CONSTRAINT roles_user_ibfk_2 FOREIGN KEY (uid) REFERENCES user (id) ON DELETE CASCADE ) ENGINEInnoDB AUTO_INCREMENT131 DEFAULT CHARSETutf8;-- ---------------------------- -- Records of roles_user -- ---------------------------- INSERT INTO roles_user VALUES (1, 1, 1); INSERT INTO roles_user VALUES (2, 2, 2); INSERT INTO roles_user VALUES (3, 3, 3); INSERT INTO roles_user VALUES (4, 1, 4);-- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS user; CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,username varchar(64) DEFAULT NULL,nickname varchar(64) DEFAULT NULL,password varchar(255) DEFAULT NULL,enabled tinyint(1) DEFAULT 1,email varchar(64) DEFAULT NULL,userface varchar(255) DEFAULT NULL,regTime datetime DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT21 DEFAULT CHARSETutf8;-- ---------------------------- -- Records of user -- ---------------------------- INSERT INTO user VALUES (1, quellanan, , $2a$10$Hv0YGLi/siOswCTP236MtOTWbClcM6rN1LCyqwfRmrwCJZqXHsj5a, 1, quellananqq.com,, 2017-12-08 09:30:22);INSERT INTO user VALUES (2, qaz, , $2a$10$6H69XLebCrGhHeHzDXEoH.0x8tMFS0XfdDPwI5s.Eu9pbqRpncA.G, 1, quellananqq.com,, 2017-12-08 09:30:22);INSERT INTO user VALUES (3, wsx, , $2a$10$6H69XLebCrGhHeHzDXEoH.0x8tMFS0XfdDPwI5s.Eu9pbqRpncA.G, 1, quellananqq.com,, 2017-12-08 09:30:22);INSERT INTO user VALUES (4, test, , $2a$10$6H69XLebCrGhHeHzDXEoH.0x8tMFS0XfdDPwI5s.Eu9pbqRpncA.G, 1, quellananqq.com,, 2017-12-08 09:30:22);SET FOREIGN_KEY_CHECKS1; pom.xml 增加依赖我们首先在原先pom 文件基础上增加如下依赖。 dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdscoperuntime/scope/dependencydependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion2.1.0/version/dependencydependencygroupIdorg.apache.commons/groupIdartifactIdcommons-pool2/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependency前面三个是mysql 和mybatis的依赖。lombok 是一个工具类插件。同时我们需要修改一下pom 文件中的build 不然我们项目可能会找不到mybatis 的xml文件。 buildresourcesresourcedirectorysrc/main/java/directoryincludesinclude**/*.xml/include/includes/resourceresourcedirectorysrc/main/resources/directory/resource/resourcespluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build配置application.propertiesspring.datasource.driver-class-namecom.mysql.jdbc.Driver spring.datasource.urljdbc:mysql://127.0.0.1:3306/quellanan?allowMultiQueriestrueuseUnicodetruecharacterEncodingutf8serverTimezoneUTC spring.datasource.usernameroot spring.datasource.password123456 spring.datasource.max-idle10 spring.datasource.max-wait10000 spring.datasource.min-idle5 spring.datasource.initial-size5这里如果想要打印mybatis 的sql 日志。可以添加一个mybatis-config.xml文件和application.properties 同目录?xml version1.0 encodingUTF-8 ? !DOCTYPE configuration PUBLIC -//mybatis.org//DTD Config 3.0//EN http://mybatis.org/dtd/mybatis-3-config.dtd configurationsettingssetting namelogImpl valueSTDOUT_LOGGING //settings /configuration并在application.properties 中加上mybatis.config-locationclasspath:/mybatis-config.xmlentry我们在entry 包下创建 RoleEntry。代码如下Getter Setter public class RoleEntry {private Long id;private String name; } 我们在创建 UserEntry 但是UserEntry 比较特殊因为我们需要使用Spring security 。所以这里UserEntry 需要实现 UserDetails。代码如下Setter Getter public class UserEntry implements UserDetails {private Long id;private String username;private String password;private String nickname;private boolean enabled;private ListRoleEntry roles;private String email;private String userface;private Timestamp regTime;/*** 获取角色权限* return*/Overridepublic Collection? extends GrantedAuthority getAuthorities() {ListGrantedAuthority authorities new ArrayList();for (RoleEntry role : roles) {authorities.add(new SimpleGrantedAuthority(ROLE_ role.getName()));}return authorities;}/*** 获取密码* return*/Overridepublic String getPassword() {return password;}/*** 获取用户名* return*/Overridepublic String getUsername() {return username;}/*** 用户账号是否过期*/Overridepublic boolean isAccountNonExpired() {return true;}/*** 用户账号是否被锁定*/Overridepublic boolean isAccountNonLocked() {return true;}/*** 用户密码是否过期*/Overridepublic boolean isCredentialsNonExpired() {return true;}/*** 用户是否可用*/Overridepublic boolean isEnabled() {return enabled;} } 可以看到基本上都是重写的方法。也比较简单。mapper这里我将xml 文件和接口放在一起了你们也可以在resources 中创建一个mapper,将xml 文件放在哪里。mapper层没有什么好说的是mybatis 的一些知识我们这里讲代码贴出来。RolesMapperMapper public interface RolesMapper {ListRoleEntry getRolesByUid(Long uid); }RolesMapper.xml?xml version1.0 encodingUTF-8 ? !DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.zlflovemm.security.mapper.RolesMapperselect idgetRolesByUid parameterTypelong resultTypecom.zlflovemm.security.entry.RoleEntrySELECT r.* FROM roles r,roles_user ru WHERE r.idru.rid AND ru.uid#{uid}/select /mapperUserMapperMapper public interface UserMapper {UserEntry loadUserByUsername(Param(username) String username); }UserMapper.xml?xml version1.0 encodingUTF-8 ? !DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.zlflovemm.security.mapper.UserMapperselect idloadUserByUsername resultTypecom.zlflovemm.security.entry.UserEntrySELECT * FROM user WHERE username#{username}/select /mapperservice在service 层我们要注意一点我们需要实现 UserDetailsService 接口。我们先创建一个UserService 继承 UserDetailsService。然后创建一个UserServiceImpl 来时实现UserService 从而达到实现UserDetailsService的目的。这样做是为了保证项目结构的统一层次。UserServicepublic interface UserService extends UserDetailsService { }UserServiceImplService Slf4j Transactional public class UserServiceImpl implements UserService {AutowiredUserMapper userMapper;AutowiredRolesMapper rolesMapper;Overridepublic UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {UserEntry user userMapper.loadUserByUsername(s);if (user null) {//避免返回null这里返回一个不含有任何值的User对象在后期的密码比对过程中一样会验证失败return new UserEntry();}//查询用户的角色信息并返回存入user中ListRoleEntry roles rolesMapper.getRolesByUid(user.getId());user.setRoles(roles);return user;} }可以看到主要是为了实现 loadUserByUsername的方法。在这个方法中我们 loadUserByUsername和getRolesByUid 就是我们在mapper 定义的查询数据库数据的方法。SecurityConfig前面做了这么多其实都是准备工作主要的目的就是提供一个Bean 。做完上面这些我们再回到 SecurityConfig 中其实我们现在需要修改的很少了。我们将用户写在内存的方法注释掉。通过数据库查询。Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter {AutowiredUserService userService;Beanpublic PasswordEncoder passwordEncoder() {// BCryptPasswordEncoderSpring Security 提供的加密工具return new BCryptPasswordEncoder();}Overridepublic void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userService).passwordEncoder(passwordEncoder());//passwoldEncoder是对密码的加密处理如果user中密码没有加密则可以不加此方法。注意加密请使用security自带的加密方式。}}可以和开始的 SecurityConfig 文件对比下其实你就是多了一个userService然后configure(AuthenticationManagerBuilder auth)中是通过userService 进行校验的。测试好了其实到这里我们就已经完成了我们启动项目就可以看到和之前写在内存中达到一样的效果。过滤以为到这就完了其实还有一点哈哈。我们现在是所有的接口都需要先登录才能访问没有登录的话就跳转到login界面。实际上我们肯定有些是不需要认证也可以访问的比如以下静态文件或者注册的请求。所以我们还是要配置一下过滤。其实也很简单一样的在 SecurityConfig 文件中 重写 configure(HttpSecurity http) 方法。这里我直接参考官网上的。https://spring.io/guides/gs/securing-web/该configure(HttpSecurity)方法定义应保护哪些URL路径不应该保护哪些URL路径。具体而言“ /”和“ / home”路径配置为不需要任何身份验证。所有其他路径必须经过验证。用户成功登录后他们将被重定向到之前要求身份验证的页面。有一个由指定的自定义“ /登录”页面loginPage()每个人都可以查看它。我们代码中 把 loginPage(/login) 注释掉就好了如果不注释的话就需要我们自己写login 界面和请求。我们这里就用框架自带的。 Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers(/, /hello).permitAll().anyRequest().authenticated().and().formLogin()//.loginPage(/login).permitAll().and().logout().permitAll();}这样配置就说明 /hell 和 / 请求不会拦截其他的请求需要先登录才能访问。为了更方便的看到效果我们在HelloController 中再加两个方法 RequestMapping(/hello2)public String hello2(){return hello adada;}RequestMapping(/)public String hello3(){return qazqeee;} }现在我们启动来看下效果。证明我们配置的过滤是有效果的。番外到此算是差不多结束了其实还有很多知识点不是一篇文章能讲完的这里算是抛转引玉希望对大家有帮助。后面我也会持续更新好了源码我上传到github 上啦https://github.com/QuellanAn/security后续加油♡欢迎大家关注个人公众号 程序员爱酸奶分享各种学习资料包含javalinux大数据等。资料包含视频文档以及源码同时分享本人及投递的优质技术博文。如果大家喜欢记得关注和分享哟❤http://weixin.qq.com/r/lSpcRJ-EBsJ5rdsn93_H (二维码自动识别)
http://www.ihoyoo.com/news/93614.html

相关文章:

  • 扬州做网站需要多少钱pc端和移动端的网站区别是什么
  • 网站30g流量微信小程序电脑端打开
  • 有哪些网站适合大学生做兼职搜狗推广后台登录
  • 网站导航包括抚州建设工程造价管理站网站
  • 福州seo网站管理wordpress怎么做站群
  • 沈阳谷歌网站建设wordpress付费剧集网站
  • 做淘宝头像的网站有哪些有哪些做微博长图网站
  • 上海互联网网站建设公司wordpress ajax接口
  • 物流网站建设方案范文电商千万不要做虾皮
  • 肯德基网站建设为网站网站做代理
  • 深圳百度推广代理东莞企业seo推广
  • 邢台手机网站建设积玉桥网站建设
  • 200M电信宽带做网站国内快速建站
  • 福田网站建设标准数据老山网站建设
  • 百度站长工具官网wordpress设置谷歌验证
  • 网站怎么做优化排名软件编程学什么专业
  • 做亚马逊联盟一定要有网站吗js 下载服务器wordpress
  • 手机网站模板制作教程安徽农垦建设工程信息网
  • 做推广必须知道的网站吗为wordpress配置邮箱服务
  • 网站开发后怎么转安卓appseo两个域名一个网站有影响
  • 做单页网站需要做什么wordpress 轮播图插件
  • 给网站做选题wordpress 数据库建立
  • 电子商务网站建设作业文档家具网站开发报告
  • 四川做网站多少钱百科主题wordpress
  • 域名注册完成后怎么做网站在哪里做网站效果好
  • 更新网站 是否要重启iis赣州网上房地产备案网
  • 友汇网网站建设管理后台设置wordpress添加锚
  • 免费wap建站的网址是什么了网络运营者开展经营和服务活动必须遵守法律行政法规
  • 网站开发项目流程图网站建设公司专业网站研发开发
  • 做进口零食网站上海搜索推广