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

你可能感兴趣的文章
object detection错误Message type "object_detection.protos.SsdFeatureExtractor" has no field named "bat
查看>>
object detection错误之Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
查看>>
object detection错误之no module named nets
查看>>
Object of type 'ndarray' is not JSON serializable
查看>>
Object Oriented Programming in JavaScript
查看>>
object references an unsaved transient instance - save the transient instance before flushing
查看>>
Object 类的常见方法有哪些?
查看>>
Object-c动态特性
查看>>
Object.assign用法
查看>>
Object.create
查看>>
Object.defineProperty详解
查看>>
Object.keys()的详解和用法
查看>>
objectForKey与valueForKey在NSDictionary中的差异
查看>>
Objective - C 小谈:消息机制的原理与使用
查看>>
OBJECTIVE C (XCODE) 绘图功能简介(转载)
查看>>
Objective-C ---JSON 解析 和 KVC
查看>>
Objective-C 编码规范
查看>>
Objective-Cfor循环实现Factorial阶乘算法 (附完整源码)
查看>>
Objective-C——判断对象等同性
查看>>
objective-c中的内存管理
查看>>