您好,我是码农飞哥(wei158556),感谢您阅读本文,欢迎一键三连哦。
1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通
2. 毕业设计专栏,毕业季咱们不慌忙,几百款毕业设计等你选。
❤️ 3. Python爬虫专栏,系统性的学习爬虫的知识点。9.9元买不了吃亏,买不了上当 。python爬虫入门进阶
❤️ 4. Ceph实战,从原理到实战应有尽有。 Ceph实战
❤️ 5. Java高并发编程入门,打卡学习Java高并发。 Java高并发编程入门
Shiro是一个开源的安全框架,它提供了身份认证、授权和加密等功能。Shiro具有灵活的扩展性和可配置性,可以与各种Java应用程序集成。本文将介绍Shiro框架的基本原理、主要功能和特点、使用场景以及与其他框架的比较,最后给出一个Shiro应用举例。
Shiro是一个安全框架,它提供了身份认证、授权和加密等功能。Shiro的核心组件包括Realm、SecurityManager和Cache等。Realm用于管理用户和对象,SecurityManager用于控制用户访问权限,Cache用于管理会话和缓存数据。
Shiro的工作原理如下:
Shiro的主要功能和特点如下:
Shiro适用于各种Java应用程序的安全控制,下面是一些Shiro适用的场景:
Shiro与其他安全框架相比具有以下优点:
相比之下,其他安全框架可能存在以下缺点:
下面是一个使用Shiro框架的Java Web应用程序示例:
<dependency>
<groupId>org.apache.shirogroupId>
<artifactId>shiro-coreartifactId>
<version>1.8.0version>
dependency>
public class MyShiroConfig {
private static SecurityManager securityManager = null;
public static SecurityManager getSecurityManager() {
if (securityManager == null) {
DefaultSecurityManager securityManager = new DefaultSecurityManager();
securityManager.setRealm(new MyRealm()); // 设置自定义Realm
SecurityUtils.setSecurityManager(securityManager);
return securityManager;
}
return securityManager;
}
}
public class MyRealm extends AuthorizingRealm {
// 模拟用户和角色信息
private static Map<String, String> userMap = new HashMap<>();
private static Map<String, Set<String>> roleMap = new HashMap<>();
static {
userMap.put("admin", "123456");
roleMap.put("admin", new HashSet<>(Arrays.asList("admin")));
userMap.put("user", "123456");
roleMap.put("user", new HashSet<>(Arrays.asList("user")));
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
String username = (String) principals.getPrimaryPrincipal();
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
authorizationInfo.setRoles(roleMap.get(username));
return authorizationInfo;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
String username = (String) token.getPrincipal();
String password1 = userMap.get(username);
if (password1 == null) {
throw new UnknownAccountException();
}
SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(username, password1, getName());
return authenticationInfo;
}
}
public class MyFilterChainDefinition {
private static Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
static {
filterChainDefinitionMap.put("/admin/**", "roles[admin]");
filterChainDefinitionMap.put("/user/**", "roles[user]");
filterChainDefinitionMap.put("/login", "anon");
filterChainDefinitionMap.put("/**", "authc");
}
public static Map<String, String> getFilterChainDefinitionMap() {
return filterChainDefinitionMap;
}
}
public class TestShiro {
public static void main(String[] args) {
SecurityManager securityManager = MyShiroConfig.getSecurityManager();
SecurityUtils.setSecurityManager(securityManager);
Subject currentUser = SecurityUtils.getSubject();
String username = "admin";
String password2 = "12345612";
currentUser.login(new UsernamePasswordToken(username, password2)); // 登录
System.out.println("是否登录成功:" + currentUser.isAuthenticated());
System.out.println(username + "是否有角色 user:" + currentUser.hasRole("user")); // 返回false
currentUser.logout(); // 登出
System.out.println("是否已经登出:" + currentUser.isAuthenticated());
}
}
在上述示例里,我们模拟了两个用户:admin和user,admin拥有admin角色,user拥有user角色。
访问/admin/**的URL必须要拥有admin角色才能访问,同理,/user/**的URL需要拥有user角色才能访问。
在测试代码中,我们实现了登录和登出操作,并且判断admin用户是否有user角色,最终输出登录状态和是否拥有user角色的判断结果。
Shiro框架是一个功能强大的安全框架,它提供了身份认证、授权、加密等多种安全功能。Shiro具有灵活性高、性能好、易用性好等特点,可以满足各种Java应用程序的安全需求。通过本文的介绍,我们了解了Shiro的基本原理、主要功能和特点以及使用场景,希望能够对大家学习和应用Shiro框架有所帮助。