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

外贸网站 备案昆明网站建设案例

外贸网站 备案,昆明网站建设案例,有了域名后怎么建设网站,爱站工具包文章目录前言Shiro简介Shiro的核心概念环境搭建快速入门示例1. 创建shiro.ini配置文件2. 编写测试代码自定义Realm创建shiro.ini配置文件创建自定义Realm类测试结果总结前言 在Java Web开发中,安全框架的选择一直是开发者关注的重点。Spring Security功能强大但配置…

文章目录

  • 前言
  • Shiro简介
    • Shiro的核心概念
  • 环境搭建
  • 快速入门示例
    • 1. 创建shiro.ini配置文件
    • 2. 编写测试代码
  • 自定义Realm
    • 创建shiro.ini配置文件
    • 创建自定义Realm类
    • 测试结果
  • 总结

前言

在Java Web开发中,安全框架的选择一直是开发者关注的重点。Spring Security功能强大但配置复杂,而Apache Shiro则以其简单易用、功能完整而受到广大开发者的喜爱。今天我们就来详细了解Shiro的基本使用,看看如何快速上手这个优秀的安全框架。

Shiro简介

Apache Shiro是一个功能强大且易于使用的Java安全框架,它可以帮助我们完成认证、授权、加密、缓存和会话管理等安全相关的功能。

Shiro的核心概念

  • Subject(主体):当前用户,不一定是具体的人,也可能是第三方服务
  • SecurityManager(安全管理器):Shiro的核心,协调各个组件工作
  • Realm(域):数据源,负责获取安全数据(用户、角色、权限)

环境搭建

首先,我们需要在项目中引入Shiro的相关依赖。以Maven项目为例:

<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!-- Shiro核心依赖 --><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.3.2</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency>
</dependencies>

快速入门示例

让我们从一个最简单的示例开始,了解Shiro的基本工作流程。

1. 创建shiro.ini配置文件

在resources目录下创建shiro.ini文件:

[users]
# 用户名=密码,角色1,角色2
zhang=123,admin
wang=456,user
li=789,user,manager[roles]
# 角色=权限1,权限2
admin=*
user=user:read,user:create
manager=user:*,order:read

2. 编写测试代码

public class ShiroQuickStart {public static void main(String[] args) {// 1. 获取SecurityManager工厂,此处使用Ini配置文件初始化SecurityManagerFactory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");// 2. 得到SecurityManager实例并绑定给SecurityUtilsSecurityManager securityManager = factory.getInstance();SecurityUtils.setSecurityManager(securityManager);// 3. 得到Subject及创建用户名/密码身份验证TokenSubject currentUser = SecurityUtils.getSubject();// 4. 登录if (!currentUser.isAuthenticated()) {UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123");token.setRememberMe(true); try {currentUser.login(token);logger.info("用户登录成功");} catch (UnknownAccountException uae) {logger.error("用户不存在: " + token.getPrincipal());} catch (IncorrectCredentialsException ice) {logger.error("密码错误: " + token.getPrincipal());} catch (LockedAccountException lae) {logger.error("账户被锁定: " + token.getPrincipal());} catch (AuthenticationException ae) {logger.error("认证失败");}}// 5. 权限检查if (currentUser.hasRole("admin")) {logger.info("用户拥有admin角色");} else {logger.info("用户没有admin角色");}// 检查具体权限if (currentUser.isPermitted("user:create")) {logger.info("用户有创建用户的权限");} else {logger.info("用户没有创建用户的权限");}// 6. 退出登录currentUser.logout();}
}

自定义Realm

在实际项目中,我们通常需要从数据库获取用户信息,这时就需要自定义Realm。

创建shiro.ini配置文件

[main]
#声明realm
myClass = com.coldscholor.shiro.MyRealm
#注册realm到securityManager中
securityManager.realm = $myClass

创建自定义Realm类

/*** Realm域:Shiro从Realm获取安全数据(如用户、角色、权限),* 就是说SecurityManager要验证用户身份,那么它需要从Realm* 获取相应的用户进行比较以确定用户身份是否合法;也需要从Realm* 得到用户相应的角色/权限进行验证用户是否能进行操作;可以把* Realm看成DataSource,即安全数据源* <p>* 自定义realms对象* 继承AuthorizingRealm* 重写方法* doGetAuthorizationInfo:授权* 获取到用户的授权数据(用户的权限数据)* doGetAuthenticationInfo:认证* 根据用户名密码登录,将用户数据保存(安全数据)*/
public class MyRealm extends AuthorizingRealm {public MyRealm() {// 设置密码匹配器HashedCredentialsMatcher matcher = new HashedCredentialsMatcher(DigestsUtil.SHA1);// 设置迭代次数matcher.setHashIterations(DigestsUtil.COUNTS);// 设置加密方式setCredentialsMatcher(matcher);}/*** 授权* @param principalCollection* @return*/@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {System.out.println("授权");// 获取用户名String username = (String) principalCollection.getPrimaryPrincipal();System.out.println("用户名:" + username);// 用户的权限数据List<String> perms = new ArrayList<>();perms.add("save");perms.add("update");perms.add("delete");perms.add("find");// 用户的角色数据List<String> roles = new ArrayList<>();roles.add("admin");roles.add("user");SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();info.addStringPermissions(perms);info.addRoles(roles);return info;}/*** 认证** @param authenticationToken* @return* @throws AuthenticationException*//*@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {System.out.println("认证");UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;String username = token.getUsername();String password = new String(token.getPassword());if ("admin".equals(username) && "123456".equals(password)) {// 参数:用户名,密码,当前realm对象的名称SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username, password, getName());return info;} else {throw new RuntimeException("用户名或密码错误,认证失败");}}*//*** 对密文密码进行解密并认证* salt:是一个随机字符串,用于对密码进行加密* @param authenticationToken* @return* @throws AuthenticationException*/@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {System.out.println("认证");UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;String username = token.getUsername();SecurityService securityService = new SecurityServiceImpl();Map<String,String> map = securityService.findPasswordByLoginName(username);if(map == null){throw new RuntimeException("用户不存在");}String salt = map.get("salt");String password =  map.get("password");//参数1:安全数据   参数2:密码   参数3:混淆字符串  参数4:realm名称SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username, password, ByteSource.Util.bytes(salt), getName());return info;}
}

测试结果

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
认证
登录结果:true

总结

Apache Shiro作为一个轻量级的安全框架,具有简单易用、功能完整的特点。在实际项目中,建议根据具体的业务需求选择合适的配置方式,并结合缓存、异常处理等机制,构建一个安全、高效的权限管理系统。Shiro虽然简单,但功能强大。掌握了这些基本用法,相信你已经能够在项目中熟练使用Shiro来处理安全相关的需求了。

http://www.dtcms.com/a/488426.html

相关文章:

  • 新建网站求友链平台河南建设工程信息网查询
  • 视觉设计网站推荐中山市做网站专业的
  • 集团网站群建设方案法治建设网站模块名称
  • 聊城网站制作价格企业网站源码利于优化
  • 网站不接入备案wordpress videotheme
  • 目标检测算法
  • 辽宁省城乡建设规划院网站12380举报网站制度建设
  • 南京网站设计公司排名东营可以做网站的公司在哪
  • wordpress建群站网上销售怎么做的更好
  • html5网站布局教程一个网站的作用是什么
  • 15-K均值聚类:分析基于距离的经典聚类算法及其应用
  • 见网站建设客户技巧东莞推广系统哪里找
  • 做外贸英语要什么网站价值30万的网站建设
  • 13-哈希md5案例:My Token
  • 做淘宝保健品药品在哪个网站找素材小程序开发制作流程
  • 婚纱摄影网站开发背景购物国外网站的建立
  • Seata分布式事务深度解析笔记
  • 网络营销站点推广的方法商标设计网址大全
  • jsp做物流网站网站建设制作放之
  • 广州php网站建设建一个网站需要什么条件
  • 南冒网站建设制作推广公司有趣的网站代码
  • 重庆网站建设公司 菠拿拿关闭WordPress主题自适应
  • 网站设计与开发的基本步骤包括哪些?不知道是谁做的网站 输入学号
  • 影响同步带模组成本的五大核心变量分析
  • 网站服务公司人工成本进什么费用网站维护中
  • 如何做网站内容管理搜狐广告收费标准
  • 建公司网站建设明细报价表北京东方华美建设集团有限公司网站
  • 网站建设各语言优点宝安自适应网站建设
  • day08-排行榜功能
  • 网站怎么建立会员wordpress 去购买按钮