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

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

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层逻辑

@Controllerpublic 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基于Express框架搭建一个简单的注册登录Web功能
查看>>
Node.js安装与配置指南:轻松启航您的JavaScript服务器之旅
查看>>
Node.js安装及环境配置之Windows篇
查看>>
Node.js安装和入门 - 2行代码让你能够启动一个Server
查看>>
node.js安装方法
查看>>
Node.js官网无法正常访问时安装NodeJS的方法
查看>>
Node.js的循环与异步问题
查看>>
Node.js高级编程:用Javascript构建可伸缩应用(1)1.1 介绍和安装-安装Node
查看>>
nodejs + socket.io 同时使用http 和 https
查看>>
NodeJS @kubernetes/client-node连接到kubernetes集群的方法
查看>>
Nodejs express 获取url参数,post参数的三种方式
查看>>
nodejs http小爬虫
查看>>
nodejs libararies
查看>>
nodejs npm常用命令
查看>>
Nodejs process.nextTick() 使用详解
查看>>
nodejs 发起 GET 请求示例和 POST 请求示例
查看>>
NodeJS 导入导出模块的方法( 代码演示 )
查看>>
nodejs 开发websocket 笔记
查看>>
nodejs 的 Buffer 详解
查看>>