博客
关于我
Shiro笔记
阅读量:603 次
发布时间:2019-03-12

本文共 4837 字,大约阅读时间需要 16 分钟。

Shiro框架简介及配置实践

Shiro框架概述

Shiro(Apache Shiro)是一个功能强大的 Java 安全框架,主要用于身份认证、权限管理、会话控制等方面的应用开发。其核心目标是提供一个灵活且安全的身份验证和授权机制,适用于各种类型的应用场景。

Shiro的核心功能

  • 身份认证(Authentication):验证用户身份是否合法,确认用户是否已登录。
  • 权限管理(Authorization):检查已认证用户是否有访问特定资源的权限。
  • 会话管理(Session Manager):维护用户的会话信息,确保用户在未退出前信息完整。
  • 数据加密(Cryptography):保护敏感数据,如用户密码的存储。
  • Web集成(Web Support):简化在Web环境中的安全配置。
  • 缓存管理(Caching):缓存用户信息以提高应用性能。
  • 并发控制(Concurrency):确保多线程环境下的安全性。
  • 测试支持(Testing):提供便捷的测试工具。
  • Remember Me功能:实现用户记住登录状态的功能。

Shiro的工作原理

Shiro的核心组件包括 SubjectSecurityManagerRealm 等。Subject代表当前操作的主体,可能是用户,也可能是其他系统组件。SecurityManager作为安全管理器,负责处理所有安全相关的逻辑,包括身份认证和权限授权。Realm则作为数据源,用于获取用户认证和权限信息。

Realm的作用

Realm类似于数据源,负责提供安全相关的数据。Shiro允许开发者定义多个Realm,分别负责不同的认证和授权逻辑。例如,一个Realm可能连接数据库,验证用户名和密码;另一个Realm可能连接LDAP服务器,检索用户信息。

Shiro配置实践

在实际项目中,Shiro的配置通常涉及以下几个方面:

Web.xml配置

shiroFilter
org.springframework.web.filter.DelegatingFilterProxy
targetFilterLifecycle
true
shiroFilter
/*

applicationContext-shiro.xml配置

/login = anon
/toLogin = anon
/regist = anon
/index.jsp = anon
/logout = logout
/toAdmin = roles[admin]
/toUser = roles[user]
/** = authc

Controller层逻辑

@Controller
public class ShiroController {
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(@RequestParam("username") String username,
@RequestParam("password") String password) {
Subject currentUser = SecurityUtils.getSubject();
if (!currentUser.isAuthenticated()) {
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
try {
currentUser.login(token);
} catch (Exception e) {
return "/error";
}
return "/success";
}
return "/success";
}
}

Realm实现细节

public class ShiroRealm extends AuthorizingRealm {
@Autowired
private UserDao userDao;
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
String username = usernamePasswordToken.getUsername();
User user = userDao.findByUname(username);
if (null != user) {
return new SimpleAuthenticationInfo(username, user.getPassword(),
ByteSource.Util.bytes(user.getId().toString()), this.getName());
} else {
throw new AuthenticationException("用户不存在");
}
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal) throws AuthorizationException {
String username = principal.toString();
User user = userDao.findByUname(username);
if (null != user) {
Set
roles = new HashSet<>();
roles.add(user.getRole());
return new SimpleAuthorizationInfo(roles);
} else {
throw new AuthorizationException("用户不存在或无权限");
}
}
}

配置文件解析

多Realm配置

授权配置

授权方式与实现

Shiro提供了多种授权方式,包括编程式授权、注解式授权和标签式授权。以下是通过自定义Realm实现的角色授权例子:

角色授权配置

/shiro:hasRole name="admin">访问管理员页面

Realm实现

public class RoleBasedRealm extends AuthorizingRealm {
@Autowired
private UserDao userDao;
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal) {
String username = principal.toString();
User user = userDao.findByUname(username);
if (null != user && user.getRole() != null) {
return new SimpleAuthorizationInfo Collections.singleton(user.getRole()));
} else {
return null;
}
}
}

总结

通过以上配置和实现,Shiro框架能够为应用提供强大的安全功能。从身份认证到权限管理,Shiro都提供了灵活的配置选项,能够适应不同项目的需求。合理配置Shiro框架,将有助于提升应用的安全性和性能。

转载地址:http://lebxz.baihongyu.com/

你可能感兴趣的文章
Node.js卸载超详细步骤(附图文讲解)
查看>>
Node.js卸载超详细步骤(附图文讲解)
查看>>
Node.js基于Express框架搭建一个简单的注册登录Web功能
查看>>
node.js学习之npm 入门 —8.《怎样创建,发布,升级你的npm,node模块》
查看>>
Node.js安装与配置指南:轻松启航您的JavaScript服务器之旅
查看>>
Node.js安装及环境配置之Windows篇
查看>>
Node.js安装和入门 - 2行代码让你能够启动一个Server
查看>>
node.js安装方法
查看>>
Node.js官网无法正常访问时安装NodeJS的方法
查看>>
node.js模块、包
查看>>
node.js的express框架用法(一)
查看>>
Node.js的交互式解释器(REPL)
查看>>
Node.js的循环与异步问题
查看>>
Node.js高级编程:用Javascript构建可伸缩应用(1)1.1 介绍和安装-安装Node
查看>>
nodejs + socket.io 同时使用http 和 https
查看>>
NodeJS @kubernetes/client-node连接到kubernetes集群的方法
查看>>
NodeJS API简介
查看>>
Nodejs express 获取url参数,post参数的三种方式
查看>>
nodejs http小爬虫
查看>>
nodejs libararies
查看>>