java 权限控制 demo,杨鹏的个人博客 - JAVA学习之springmvc+mybatis集成shiro权限控制(二)...

本文介绍如何使用SpringMVC结合MyBatis和Shiro实现权限控制,包括自定义Realm进行用户认证和授权的过程,以及登录方法的实现。

接上文JAVA学习之springmvc+mybatis集成shiro权限控制(一)

5、创建Realm并编码实现package com.godyang.demo.shiro;

import java.util.Set;

import org.apache.shiro.authc.AuthenticationException;

import org.apache.shiro.authc.AuthenticationInfo;

import org.apache.shiro.authc.AuthenticationToken;

import org.apache.shiro.authc.LockedAccountException;

import org.apache.shiro.authc.SimpleAuthenticationInfo;

import org.apache.shiro.authc.UnknownAccountException;

import org.apache.shiro.authc.UsernamePasswordToken;

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.util.ByteSource;

import org.springframework.beans.factory.annotation.Autowired;

import com.godyang.demo.po.ShiroUsers;

import com.godyang.demo.service.ShiroUserService;

public class CustomRealm extends AuthorizingRealm {

@Autowired

private ShiroUserService shiroUserService;

/**

* 授权

*

* @param principalCollection

* @return

*/

@Override

protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {

// 1、从PrincipalCollection中获取登录的用户信息

ShiroUsers user = (ShiroUsers) principals.getPrimaryPrincipal();

// 2、创建SimpleAuthorizationInfo对象

SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();

// 3、获取并设置role

Set tt = shiroUserService.findRoles(user.getUsername());

authorizationInfo.setRoles(tt);

// 4、获取并设置Permissions

Set ss = shiroUserService.findPermissions(user.getUsername());

authorizationInfo.setStringPermissions(ss);

return authorizationInfo;

}

/**

* 认证

*

* @param authenticationToken

* @return

* @throws AuthenticationException

*/

@Override

protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {

// 1、把AuthenticationToken转换为UsernamePasswordToken

UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;

// 2、从UsernamePasswordToken中获取用户名

String username = usernamePasswordToken.getUsername();

// 3、根据用户名获取数据库的用户信息

ShiroUsers shiroUsers = shiroUserService.findByUsername(username);

// 4.如果用户不存在,抛出用户不存在异常

if (shiroUsers == null) {

throw new UnknownAccountException("用户不存在!");// 没找到帐号

}

// 5、根据用户信息,抛出用户锁定异常

if (Boolean.TRUE.equals(false)) {

throw new LockedAccountException("帐号锁定"); // 帐号锁定

}

// 6、根据用户情况,构造AuthenticationInfo并返回

// 以下数据是从数据库获取的

// a、principal用户信息,user实体

Object principal = shiroUsers;

// b、用户密码

Object credentials = shiroUsers.getPassword();

// c、当前realm的getname()

String realmName = getName();

// d、盐值,

ByteSource credentialsSalt = ByteSource.Util.bytes(shiroUsers.getUsername());

SimpleAuthenticationInfo info = null;

info = new SimpleAuthenticationInfo(principal, credentials, credentialsSalt, realmName);

return info;

}

}

6、编码实现登录的方法@RequestMapping(value = "/logincheck")

public String logincheck(String username, String password, Model model, HttpServletRequest request) {

if (username == null || username.equals("")) {

model.addAttribute("userName", "用户名不能为空!");

logger.error("---------------------用户名不能为空!---------------");

return "login/login";

}

if (password == null || password.equals("")) {

model.addAttribute("passwd", "密码不能为空!");

logger.error("---------------------密码不能为空!---------------");

return "login/login";

}

// password = MD5Util.getMD5PwdFromUserNameAndPwd(username, password);

Subject subject = SecurityUtils.getSubject();

if (!subject.isAuthenticated()) {

UsernamePasswordToken token = new UsernamePasswordToken(username, password);

// 记住我

token.setRememberMe(true);

try {

subject.login(token);

} catch (UnknownAccountException e) {

e.printStackTrace();

model.addAttribute("errtxt", "用户名错误!");

logger.error("---------------------用户名错误!---------------");

return "login/login";

} catch (IncorrectCredentialsException e) {

e.printStackTrace();

logger.error("---------------------密码错误!---------------");

model.addAttribute("errtxt", "密码错误");

return "login/login";

} catch (LockedAccountException e) {

e.printStackTrace();

logger.error("---------------------用户被锁定!---------------");

model.addAttribute("errtxt", "用户被锁定");

return "login/login";

} catch (AuthenticationException e) {

e.printStackTrace();

logger.error("---------------------登录失败!---------------");

model.addAttribute("errtxt", "登录失败");

return "login/login";

}

}

return "redirect:/";

}

最后,加入相应的jsp页面,编写controller,基本的springmvc+mybatis集成shiro就完成了!

内容概要:本文研究了在通信资源受限与恶意攻击干扰下的孤岛微电网分布式次控制策略,提出了一种兼具通信效率与攻击弹性的动态事件触发控制方案,旨在实现电压频率的精确恢复与有功无功功率的均衡共享。通过Simulink仿真与Matlab代码实现,系统验证了该策略在显著降低通信频次的同时,能够有效抵御拒绝服务(DoS)等网络攻击,保障微电网在复杂环境下的稳定运行。研究深入探讨了动态事件触发机制的设计、分布式控制算法的弹性优化,并确保系统具备排除芝诺行为的能力,从而全面提升微电网在极端条件下的鲁棒性、可靠性与运行效率。; 适合人群:具备电力系统、自动化或相关领域基础知识,从事微电网、分布式控制、能源系统安全方向研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于孤岛微电网在遭受通信限制和网络攻击时的次电压与频率调节;②为高比例新能源接入场景下的微电网提供具备攻击容忍能力的弹性控制解决方案;③支持科研仿真验证与教学演示,推动分布式能源系统安全控制技术的发展。; 阅读建议:建议结合提供的Simulink模型与Matlab代码进行仿真实践,深入理解控制策略的实现细节,并可通过修改攻击模型、通信参数或网络拓扑进行拓展性研究,以全面掌握其弹性机制与优化潜力。
上市公司绿色全要素生产率(Green Total Factor Productivity,简称GTFP)是衡量企业绿色发展和资源配置效率的重要指标,其不仅关注经济效益,还强调环境效益,体现了绿色发展理念。 一、上市公司绿色全要素生产率的介绍 上市公司绿色全要素生产率是衡量企业在实现绿色发展的过程中,如何有效地利用劳动、资本、能源等资源进行生产的综合效率。本分享数据涵盖2500+家上市公司,数据年份为2007-2022年,共46424条样本,含证券代码、年份、绿色全要素生产率、绿色技术效率变化指数、绿色技术进步变化指数。 、数据指标 绿色全要素生产率 绿色技术效率变化指数 绿色技术进步变化指数 用于衡量企业绿色发展效率的综合指标 反映绿色技术使用效率的变化 衡量绿色技术进步的效果 三、测算方式 企业绿色全要素生产率的测算采用了非径向SBM-ML指数(简称“ML指数”)模型。该模型通过将企业的环境污染、绿色技术进步等因素纳入生产效率评价体系,全面反映了企业在绿色发展方面的整体表现。 具体的测算方式如下: (1)要素投入:以企业员工数作为劳动投入的代理变量,企业固定资产净额作为资本投入的代理变量,企业所在城市的工业用电量根据企业从业人员占城市城镇人员就业比重进行换算作为能源投入的代理变量。 (2)期望产出:以企业的营业收入作为期望产出的代理变量。 (3)非期望产出:将企业从业人员占所在城市城镇人员就业比重与“工业三废”(即工业氧化硫、工业废水、工业烟粉尘排放量)结合,进行换算,作为非期望产出的代理变量。 四、参考文献 崔立志,孙旺,黄敏敏.新能源示范城市建设对企业绿色全要素生产率的影响研究——基于A股上市公司的实证分析[J].广西财经学院学报,2023,36(01):92-104. 五、数据来源 数据来源于《中国城市统计年鉴》、《中国环境统计年鉴》、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值