博客
关于我
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/

你可能感兴趣的文章
npm run dev 报错PS ‘vite‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
查看>>
npm scripts 使用指南
查看>>
npm should be run outside of the node repl, in your normal shell
查看>>
npm start运行了什么
查看>>
npm WARN deprecated core-js@2.6.12 core-js@<3.3 is no longer maintained and not recommended for usa
查看>>
npm 下载依赖慢的解决方案(亲测有效)
查看>>
npm 安装依赖过程中报错:Error: Can‘t find Python executable “python“, you can set the PYTHON env variable
查看>>
npm.taobao.org 淘宝 npm 镜像证书过期?这样解决!
查看>>
npm—小记
查看>>
npm上传自己的项目
查看>>
npm介绍以及常用命令
查看>>
NPM使用前设置和升级
查看>>
npm入门,这篇就够了
查看>>
npm切换到淘宝源
查看>>
npm切换源淘宝源的两种方法
查看>>
npm前端包管理工具简介---npm工作笔记001
查看>>
npm包管理深度探索:从基础到进阶全面教程!
查看>>
npm升级以及使用淘宝npm镜像
查看>>
npm发布包--所遇到的问题
查看>>
npm发布自己的组件UI包(详细步骤,图文并茂)
查看>>