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

做网站容易 但运营难/怎么联系百度推广

做网站容易 但运营难,怎么联系百度推广,经营之道的优势,镜像网站做排名自己搭建的SpringBoot项目集成Shiro框架 Shiro框架的核心组件是Subject,SecurityManager,Realms。 subject: Subject一词是一个安全术语,其基本意思是“当前的操作用户”。称之为“用户”并不准确,因为“用户”一词通…

自己搭建的SpringBoot项目集成Shiro框架

Shiro框架的核心组件是Subject,SecurityManager,Realms。
subject: Subject一词是一个安全术语,其基本意思是“当前的操作用户”。称之为“用户”并不准确,因为“用户”一词通常跟人相关。在安全领域,术语“Subject”可以是人,也可以是第三方进程、后台帐户(Daemon Account)、定时作业(Corn Job)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。但考虑到大多数目的和用途,你可以把它认为是Shiro的“用户”概念。
在程序中你都能轻易的获得Subject,允许在任何需要的地方进行安全操作每个Subject对象都必须与一个SecurityManager进行绑定,你访问Subject对象其实都是在与SecurityManager里的特定Subject进行交互。

SecurityManager: Subject的“幕后”推手是SecurityManager。Subject代表了当前用户的安全操作,SecurityManager则**管理所有用户的安全操作**。它是Shiro框架的核心,充当“保护伞”,引用了多个内部嵌套安全组件,它们形成了对象图。但是,一旦SecurityManager及其内部对象图配置好,它就会退居幕后,应用开发人员几乎把他们的所有时间都花在Subject API调用上。

那么,如何设置SecurityManager呢?嗯,这要看应用的环境。例如,Web应用通常会在Web.xml中指定一个Shiro Servlet Filter,这会创建SecurityManager实例,如果你运行的是一个独立应用,你需要用其他配置方式,但有很多配置选项。
一个应用几乎总是只有一个SecurityManager实例。它实际是应用的Singleton(尽管不必是一个静态Singleton)。跟Shiro里的几乎所有组件一样,SecurityManager的缺省实现是POJO,而且可用POJO兼容的任何配置机制进行配置 - 普通的Java代码、Spring XML、YAML、.properties和.ini文件等。基本来讲,能够实例化类和调用JavaBean兼容方法的任何配置形式都可使用。

Realms:Shiro的第三个也是最后一个概念是Realm。Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当与像用户帐户这类安全相关数据进行交互,执行认证(登录)和授权(访问控制)时,Shiro会从应用配置的Realm中查找很多内容。

从这个意义上讲,Realm实质上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。配置多个Realm是可以的,但是至少需要一个。
Shiro内置了可以连接大量安全数据源(又名目录)的Realm,如LDAP、关系数据库(JDBC)、类似INI的文本配置资源以及属性文件 等。如果缺省的Realm不能满足需求,你还可以插入代表自定义数据源的自己的Realm实现。
象其他内部组件一样,由SecurityManager来管理如何使用Realms来获取安全的身份数据。

项目开始,此时已经默认初始化好SpringBoot项目,接下来就是导入依赖。

<!--导入shiro包--><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.4.1</version></dependency>

第一步,编写上边说的三个核心组件,从下往上依赖编写。第一个是Realms,此时我们需要自己定义。

自己定义的Realms需要继承 AuthorizingRealm类,同时实现他的两个方法。一个是认证,一个是授予,代码的逻辑是后期自己定义的。目前可以忽略不写。


package com.kevin.shiro.myshiro;import com.kevin.shiro.entity.User;
import com.kevin.shiro.mapper.UserMapper;
import com.kevin.shiro.service.UserService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;/*** @Author: Kevin* @Date: 2020/7/10 11:19*/public class UserRealm extends AuthorizingRealm {@Autowiredprivate UserService userService;// 授权@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {System.out.println("doGetAuthorizationInfo授权页面工作了");return null;}// 认证@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {System.out.println("doGetAuthenticationInfo==============>认证功能工作了");return null;}
}

自定义的Relams已经实现,那么就将其交给Spingboot的管理,同样的,根据核心组件,一层一层的实现,以及注入。

Shiro提供了与Web集成的支持,其通过一个ShiroFilter入口来拦截需要安全控制的URL,然后进行相应的控制。

@Configuration
public class ShiroConfig {// 对应三个核心对象//1 shiroFilterFactory@Beanpublic ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager) {ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();// 设置安全管理器factoryBean.setSecurityManager(securityManager);// anon:无需认证可以直接访问// authc:必须认证了才能访问// user: 必须拥有记住我功能才能访问// perms : 拥有对某个资源的权限才能够访问//role:拥有某个角色权限才能够访问// 设置过滤器Map<String, String> map = new LinkedHashMap<>();//  拥有权限才能够进行map.put("/user/add","perms[user:add]");map.put("/user/update", "authc"); // 只要密码验证通过就可以进去factoryBean.setFilterChainDefinitionMap(map);// 未授权跳入到未授权界面factoryBean.setUnauthorizedUrl("/unauthor");// 设置登录页面factoryBean.setLoginUrl("/tologin");return factoryBean;}//2 DefaultWebSecurityManager@Bean(name = "securityManager")public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();// 关联RealmsecurityManager.setRealm(userRealm);return securityManager;}//3 创建realm对象,需要自定义@Bean(name = "userRealm")public UserRealm getUserRealm() {return new UserRealm();}}

第三步,此时拦截器已经有了,接下来要做的就是认证以及授权操作,那么此时我们就需要在自定义的Realms中实现认证以及授权的操作。在使用之前,我们用mybatisPlus已经实现了逆向生成,并且数据库内有一个 账户为 kevin 密码为root的账户

package com.kevin.shiro.myshiro;import com.kevin.shiro.entity.User;
import com.kevin.shiro.mapper.UserMapper;
import com.kevin.shiro.service.UserService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;/*** @Author: Kevin* @Date: 2020/7/10 11:19*/public class UserRealm extends AuthorizingRealm {@Autowiredprivate UserService userService;// 授权@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {System.out.println("doGetAuthorizationInfo授权页面工作了");// 授权SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();// 硬编码,给每个用户都授予这样的权限info.addStringPermission("user:add");// 获取session 拿到当前登录的对象Subject subject = SecurityUtils.getSubject();// 获取到当前的用户 在认证界面中传递过来的Principal即 UserUser currUser = (User) subject.getPrincipal();// 此时数据库给的权限,授予到当前info中,需要数据库中有字段。因为数据库中没有此字段,所以不展示此功能
//        info.addStringPermission(currUser.);return info;}// 认证@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {System.out.println("doGetAuthenticationInfo==============>认证功能工作了");// 用户名 密码。 从数据库取UsernamePasswordToken passwordToken = (UsernamePasswordToken) token;User user = userService.selectByName(passwordToken.getUsername());if (user == null) {System.out.println("没有此用户");throw new UnknownAccountException("用户名不存在"); // 自定义的异常}if (!passwordToken.getUsername().equals(user.getUsername())) {throw new UnknownAccountException("密码不对");// 自定义的异常}// 固定的密码认证SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user, user.getPassword(), "" );return authenticationInfo;}
}

此时的基本效果已经实现。写几个接口测试一下

package com.kevin.shiro.controller;import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;/*** @Author: Kevin* @Date: 2020/7/9 22:03*/
@Controller
public class MyController {@RequestMapping({"/index","/"})public String  toIndex(Model model) {model.addAttribute("msg", "Hello,Shiro");return "index";}@RequestMapping(value = "/user/add", method = RequestMethod.GET)public String add() {return "user/add";}@RequestMapping(value = "/user/update",method = RequestMethod.GET)public String update() {return "user/update";}@RequestMapping(value = "/tologin")public String toLogin() {return "login";}@RequestMapping(value = "/login")public String login(String username, String userpassword,Model model) {// 获取当前的用户 Subject subject = SecurityUtils.getSubject();// 封装用户的登陆信息 ,到时候token会传递到认证页面UsernamePasswordToken token = new UsernamePasswordToken(username, userpassword);// 登录用户try {subject.login(token);return "index";} catch (UnknownAccountException ex) { // 用户名不存在model.addAttribute("msg", "用户名错误");return "login";} catch (IncorrectCredentialsException exception) { // 密码不对model.addAttribute("msg", "密码错误");return "login";}}@RequestMapping("/unauthor")@ResponseBodypublic String unauthorized() {return "未经授权无法访问此页面";}
}

页面的代码不在贴了。

在这里插入图片描述

效果图如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
同时控制台打印出信息
在这里插入图片描述

使用正确的账号密码进行操作
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

http://www.jmfq.cn/news/5098861.html

相关文章:

  • 怎么找上海网站建/俄罗斯搜索引擎
  • 做淘宝客网站能有效果吗/网站推广专家十年乐云seo
  • 网站域名价值查询工具/抖音seo排名系统
  • 网站建设制作文字教程/西安seo站内优化
  • 湛江网站开发公司/百度收录入口提交查询
  • 南昌网站网站建设/找客户资源的软件
  • 网站维护 推广/上海好的seo公司
  • 医院网站信息化有哪些建设规范/莆田seo
  • 如何做一家专门卖零食的网站/seo网站优化培训价格
  • wordpress 搜索结果页/网络优化公司哪家好
  • html5网站开发测试/建站公司哪个好
  • 济南网站建设知识/seo关键词选取工具
  • pc网站平台/必应搜索引擎
  • 免费ppt模板下载网盘/seo推广编辑
  • 哈尔滨道外区建设局官方网站/seo高级
  • 南汇整站seo十大排名/免费大数据查询
  • 做可视化的网站/中国营销网官网
  • 百度网站如何做运营/新闻最近的大事10件
  • 广州哪里有外贸网站/星巴克网络营销案例分析
  • 移动端网站开发/武汉好的seo优化网
  • 淮北网站制作/嘉兴seo计费管理
  • wordpress后台500/大地seo
  • 华为公司网站建设相关内容/百度关键词优化企业
  • 简述网站设计规划的步骤/seo 页面链接优化
  • 江苏恒健建设集团有限公司网站/网站建设介绍ppt
  • 东莞建筑公司/seo类目链接优化
  • 备案用的网站建设方案书/哪里有整站优化
  • 视频解析网站制作/怎么理解搜索引擎优化
  • 建设部网站 审查系统/百度手机浏览器下载
  • 新疆5g基站建设/单页应用seo如何解决