本文共 4837 字,大约阅读时间需要 16 分钟。
Shiro(Apache Shiro)是一个功能强大的 Java 安全框架,主要用于身份认证、权限管理、会话控制等方面的应用开发。其核心目标是提供一个灵活且安全的身份验证和授权机制,适用于各种类型的应用场景。
Shiro的核心组件包括 Subject、SecurityManager、Realm 等。Subject代表当前操作的主体,可能是用户,也可能是其他系统组件。SecurityManager作为安全管理器,负责处理所有安全相关的逻辑,包括身份认证和权限授权。Realm则作为数据源,用于获取用户认证和权限信息。
Realm类似于数据源,负责提供安全相关的数据。Shiro允许开发者定义多个Realm,分别负责不同的认证和授权逻辑。例如,一个Realm可能连接数据库,验证用户名和密码;另一个Realm可能连接LDAP服务器,检索用户信息。
在实际项目中,Shiro的配置通常涉及以下几个方面:
shiroFilter org.springframework.web.filter.DelegatingFilterProxy targetFilterLifecycle true shiroFilter /*
/login = anon /toLogin = anon /regist = anon /index.jsp = anon /logout = logout /toAdmin = roles[admin] /toUser = roles[user] /** = authc
@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"; }} 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("用户不存在或无权限"); } }} Shiro提供了多种授权方式,包括编程式授权、注解式授权和标签式授权。以下是通过自定义Realm实现的角色授权例子:
/shiro:hasRole name="admin">访问管理员页面
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/