发表于: 2017-11-22 21:21:23
0 639
【今日完成】
今天讲了一波小课堂:
关于Shiro
Shiro的简单运用
1.背景介绍
先介绍下背景
Shiro是什么?
Apache Shiro(读作“sheeroh”,即日语“城”)是一个开源安全框架,提供身份验证、授权、密码和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。
城:じょう、しろ
Shiro的产生背景:Shiro的前身是JSecurity。
2004年,Les Hazlewood和Jeremy Haile创办了Jsecurity。当时他们找不到适用于应用程序级别的合适Java安全框架,同时又对JAAS非常失望。2010年9月22日,Shrio成为Apache软件基金会的顶级项目(TLP)。
Java认证和授权服务(Java Authentication and Authorization Service,简称JAAS)是一个Java以用户为中心的安全框架,作为Java以代码为中心的安全的补充。自Java运行环境(JRE) 1.4起,JAAS就被集成到JRE,而之前是作为一个扩展库由Sun公司提供的。
2.知识剖析
Shiro的几个术语
Subject
SecurityManager
Relam
Role&Permission
Subject
Subject:主体,代表了当前“用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是Subject,如网络爬虫,机器人等;即一个抽象概念;所有Subject都绑定到SecurityManager,与Subject的所有交互都会委托给SecurityManager;可以把Subject认为是一个门面;SecurityManager才是实际的执行者;
SecurityManager
安全管理器;即所有与安全有关的操作都会与SecurityManager交互;且它管理着所有Subject;可以看出它是Shiro的核心,它负责与后边介绍的其他组件进行交互,如果学习过SpringMVC,你可以把它看成DispatcherServlet前端控制器;
Relam
Realm:域,Shiro从从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法;也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作;可以把Realm看成DataSource,即安全数据源。
Role&Permission
角色与权限:一个角色可以对应多个权限。Shiro验证有两种方式。
3.常见问题
①、使用Shiro的好处是什么?
②、如何使用Shiro?
4.解决方案
①、Shiro可以使项目的验证架构更加完善,扩展性强
②、别说话,看我操作
5.编码实战
6.扩展思考
SpringSecurity,是Spring框架的一个分支,主要也是解决验证登录权限问题,可是需要Spring4.1以上的版本,无奈我们项目用的框架只支持低版本3.1.1.Release
用不了啊用不了
然后新写了几个接口
/**
* root级别管理员修改自己密码
* @author Jeff
* @Date 2017-11-22
* @param oldPassword
* @param newPassword
* @param reNewPassword
*/
@RequestMapping(value = "a/u/root/password", method = RequestMethod.POST) // @RequestMapping 注解可以用指定的URL路径访问本控制层
public String rootModify(Model model, HttpServletResponse response, HttpServletRequest request, String oldPassword,String newPassword, String reNewPassword) {
if (null == oldPassword || null == newPassword||null ==reNewPassword) {
model.addAttribute("code", -200000);
model.addAttribute("specialmessage", "参数缺失");
return "data/json";
}
try {
DesUtil des = new DesUtil("colddew");// 自定义密钥
Admin root =adminService.getObjectById(1L);
if (des.encrypt(oldPassword).equals(root.getAdminPassword())){
if (reNewPassword.equals(newPassword)){
root.setAdminPassword(des.encrypt(newPassword));
adminService.update(root);
}else {
model.addAttribute("code",-5003);
return "/data/json";
}
}else {
model.addAttribute("code",-5002);
return "/data/json";
}
} catch (Throwable e) {
e.printStackTrace();
model.addAttribute("code", -5002);
return "/data/json";
}
log.info("root修改自己账户成功");
model.addAttribute("code", 0);
return "/data/json";
}
/**
* root-管理员账户列表(动态查询)
*@param role
*@author Jeff
*@date 2017-11-22 10:41
**/
@RequestMapping(value = "/a/u/root/list", method = RequestMethod.GET)
public String getMultiAdminJson(HttpServletRequest request,
HttpServletResponse response, ModelMap model, Integer role,
Integer page,Integer size)
throws Exception {
log.info("公告动态查询");
//1 初始化参数
if (page == null) {
page = 1;
}
if (size == null) {
size = 10;
}
Integer start = (page - 1) * size;
if (start < 0) {
start = 0;
}
log.info(size);
log.info(start);
try {
// 2 通过参数拿条件
Map<String, Object> param = DynamicUtil.getAdminByRole(role);
log.info("文档参数是:" + param);
//3 通过条件拿Ids
List<Long> ids = adminService.getIdsByDynamicCondition(Admin.class, param,start,size);
log.info("the ids is " + ids);
// 4 通过Ids拿公告列表
List<Admin> articlesList = adminService.getObjectsByIds(ids);
log.info("get article data is " + articlesList.size());
List<Long> totalIds = adminService.getIdsByDynamicCondition(Admin.class, param,0,99999);
model.addAttribute("total",totalIds.size());
model.addAttribute("page", page);
model.addAttribute("size", size);
model.addAttribute("articlesList", articlesList);
model.addAttribute("code", 0);
} catch (Throwable t) {
log.error(t.getMessage());
log.error("get article error" );
model.addAttribute("code", -100000);
}
return "admin/json/adminDetailJson";
}
/**
* root级别--新增管理员
* @author Jeff
* @Date 2017-11-22
* @param adminName
* @param password
* @param role
*/
@RequestMapping(value = "a/u/root/admin", method = RequestMethod.POST) // @RequestMapping 注解可以用指定的URL路径访问本控制层
public String adminAdd(Model model, HttpServletResponse response, HttpServletRequest request, String adminName,String password, Integer role) {
if (null == adminName || null == password||null ==role) {
model.addAttribute("code", -200000);
model.addAttribute("specialmessage", "参数缺失");
return "data/json";
}
try {
DesUtil des = new DesUtil("colddew");// 自定义密钥
Admin admin =new Admin();
admin.setAdminName(adminName);
admin.setAdminPassword(des.encrypt(password));
//更新数据库后启用:admin.setRole(role);
adminService.insert(admin);
} catch (Throwable e) {
e.printStackTrace();
model.addAttribute("code", -100000);
return "/data/json";
}
log.info("root新增账户成功");
model.addAttribute("code", 0);
return "/data/json";
}
/**
* root级别--修改管理员
* @author Jeff
* @Date 2017-11-22
* @param adminName
* @param password
* @param role
* @param adminId
*/
@RequestMapping(value = "a/u/root/admin", method = RequestMethod.PUT) // @RequestMapping 注解可以用指定的URL路径访问本控制层
public String adminModify(Model model, HttpServletResponse response, HttpServletRequest request,Long adminId,String adminName,String password, Integer role) {
if (null == adminName || null == password||null ==role||null ==adminId) {
model.addAttribute("code", -200000);
model.addAttribute("specialmessage", "参数缺失");
return "data/json";
}
try {
DesUtil des = new DesUtil("colddew");// 自定义密钥
Admin admin =adminService.getObjectById(adminId);
admin.setAdminName(adminName);
admin.setAdminPassword(des.encrypt(password));
//更新数据库后启用:admin.setRole(role);
adminService.update(admin);
} catch (Throwable e) {
e.printStackTrace();
model.addAttribute("code", -100000);
return "/data/json";
}
log.info("root修改账户成功");
model.addAttribute("code", 0);
return "/data/json";
}
/**
* root级别--删除管理员
* @author Jeff
* @Date 2017-11-22
* @param adminId
*/
@RequestMapping(value = "a/u/root/admin", method = RequestMethod.PUT) // @RequestMapping 注解可以用指定的URL路径访问本控制层
public String adminDelete(Model model, HttpServletResponse response, HttpServletRequest request,Long adminId) {
if (null ==adminId) {
model.addAttribute("code", -200000);
model.addAttribute("specialmessage", "参数缺失");
return "data/json";
}
try {
adminService.delete(adminId);
} catch (Throwable e) {
e.printStackTrace();
model.addAttribute("code", -100000);
return "/data/json";
}
log.info("root删除账户成功");
model.addAttribute("code", 0);
return "/data/json";
}
【今日收获】
对shiro理解更深了,新增了几个接口
【明日计划】
自己测一下,然后部署
评论