博客
关于我
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中自启动工具supervisor的使用
查看>>
Node入门之创建第一个HelloNode
查看>>
node全局对象 文件系统
查看>>
Node出错导致运行崩溃的解决方案
查看>>
Node响应中文时解决乱码问题
查看>>
node基础(二)_模块以及处理乱码问题
查看>>
node安装卸载linux,Linux运维知识之linux 卸载安装node npm
查看>>
node安装及配置之windows版
查看>>
Node实现小爬虫
查看>>
Node提示:error code Z_BUF_ERROR,error error -5,error zlib:unexpected end of file
查看>>
Node提示:npm does not support Node.js v12.16.3
查看>>
Node搭建静态资源服务器时后缀名与响应头映射关系的Json文件
查看>>
Node服务在断开SSH后停止运行解决方案(创建守护进程)
查看>>
node模块化
查看>>
node模块的本质
查看>>
node环境下使用import引入外部文件出错
查看>>
node环境:Error listen EADDRINUSE :::3000
查看>>
Node的Web应用框架Express的简介与搭建HelloWorld
查看>>
Node第一天
查看>>
node编译程序内存溢出
查看>>