1. Shiro 소개:
Apache Shiro는 Java 보안(권한) 프레임워크입니다.
Shiro를 사용하면 JavaSE 환경뿐만 아니라 JavaEE 환경에서도 사용할 수 있는 충분한 애플리케이션을 매우 쉽게 개발할 수 있습니다. Shiro는 인증, 권한 부여, 암호화, 세션 관리, 웹 통합, 캐싱 등 모든 작업을 수행할 수 있습니다.
shiro 기능:
인증: 신원 인증, 로그인, 사용자가 해당 신원을 가지고 있는지 확인
인증: 승인, 즉 권한 확인, 인증된 사용자에게 특정 권한이 있는지 확인; 즉, 사용자가 특정 역할을 가지고 있는지 확인하거나 사용자가 특정 리소스에 대해 특정 권한을 가지고 있는지 세부적으로 확인하는 등 사용자가 수행할 수 있는 작업을 결정합니다.
세션 관리자: 세션 관리, 즉! , 사용자 로그인 후 첫 번째 세션입니다. 모든 정보는 세션에 있습니다. 세션은 일반 JavaSE 환경 또는 웹 환경일 수 있습니다.
암호화, 데이터 보안 보호; 비밀번호 암호화 일반 텍스트 대신 데이터베이스에 저장됨 웹 지원: 웹 환경에 쉽게 통합될 수 있음
캐싱: 예를 들어 사용자가 로그인한 후 사용자 정보, 역할 및 권한이 저장됩니다. 매번 확인할 필요가 없습니다. 이는 효율성을 향상시킬 수 있습니다
동시성: Shiro는 다중 스레드 응용 프로그램의 동시 확인을 지원합니다. 즉, 한 스레드에서 다른 스레드를 시작하면 권한이 자동으로 해당 스레드에 전파될 수 있습니다.
테스트: 테스트 제공 support;
다음 계정으로 실행: 사용자가 액세스를 다른 사용자로 가장하도록 허용합니다(허용하는 경우)
기억하기: 기억하세요. 이것은 매우 일반적인 기능입니다. 즉, 한 번 로그인한 후에는 그럴 필요가 없습니다. 다음에 로그인하세요
Shiro 아키텍처(외부)
외부에서 Shiro를 바라보기, 즉 애플리케이션 관점에서 작업을 완료하기 위해 shiro를 사용하는 방법을 관찰하기:
제목: 애플리케이션이 수행하는 개체 즉, Shiro의 외부 API의 핵심은 주제이고 주제는 현재 사용자를 나타냅니다. 이 사용자는 웹 크롤러와 같이 반드시 특정 사람일 필요는 없습니다. Subject와의 모든 상호 작용은 SecurityManager에 위임됩니다. Subject는 실제로 Facade이고 SecurityManageer는 실제 실행자입니다.
SecurityManager: Security Manager, 즉 모든 보안 관련 작업은 SecurityManager와 상호 작용하고 모든 것을 관리합니다. Subjects Shiro의 핵심이며 Shiro의 다른 구성 요소와의 상호 작용을 담당한다고 볼 수 있습니다. 이는 SpringMVC의
DispatcherServlet
Realm의 역할과 동일합니다. Shiro는 보안 데이터(예: 사용자, 역할, 즉, SecurityManager가 사용자의 신원을 확인하려면 사용자의 신원이 합법적인지 확인하기 위해 Realm에서 해당 사용자를 가져와야 합니다. Realm에서 사용자의 작업을 수행할 수 있는지 확인하기 위한 권한입니다.
Shiro 아키텍처(내부)
주제: 애플리케이션과 상호 작용하는 '사용자'; 관리자: SpringMVC의 DispatcherServlet과 동일하며 모든 특정 상호 작용은 보안 관리자를 통해 제어되며 인증, 승인 및 세션을 담당합니다. 주체 인증의 경우 확장 지점이며 사용자 정의할 수 있습니다. 즉, 어떤 상황에서 사용자 인증이 통과되는지 확인하는 데 사용됩니다. 주체가 해당 작업을 수행할 권한이 있는지 여부, 즉 사용자가 애플리케이션에서 액세스할 수 있는 기능을 제어합니다.
영역: 보안 엔터티 데이터 소스로 간주될 수 있는 하나 이상의 영역이 있을 수 있습니다. 보안 엔터티를 얻는 데 사용되는 것은 사용자가 제공하는 DBC 또는 메모리 구현 등을 사용하여 구현할 수 있으므로 일반적으로 애플리케이션에서는 자체 영역을 구현해야 합니다.
CacheManager: 사용자, 역할, 권한 등의 캐시를 관리하는 캐시 컨트롤러. 이러한 데이터는 기본적으로 거의 액세스할 수 없으므로 이후에 액세스가 향상될 수 있습니다.
암호화 모듈, Shiro는 비밀번호 암호화, 암호 해독 등을 위한 몇 가지 일반적인 암호화 구성 요소를 개선합니다.
2. 빠른 시작
1. 공식 웹사이트의 메시지를 따릅니다. 빠른 시작 사례 GitHub 주소를 찾으세요: shiro/samples/quickstart/
4. 빠른 시작 사례 POM을 XML 파일로 복사하세요
<dependencies> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.4.1</version> </dependency> <!-- configure logging --> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.29</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.29</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </dependencies>
5. 빠른 시작 사례의 리소스 아래에 log4j.properties를 복사합니다
6. shiro.ini 파일을 복사합니다
7. Quickstart.java
를 실행하고 시작합니다.2. 코드 분석
public class Quickstart { private static final transient Logger log = LoggerFactory.getLogger(Quickstart.class); public static void main(String[] args) { //工厂模式,通过shiro.ini配置文件中的信息,生成一个工厂实例 Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini"); SecurityManager securityManager = factory.getInstance(); SecurityUtils.setSecurityManager(securityManager); //获取当前的用户对象Subject Subject currentUser = SecurityUtils.getSubject(); //通过当前用户拿到session Session session = currentUser.getSession(); session.setAttribute("someKey", "aValue"); String value = (String) session.getAttribute("someKey"); if (value.equals("aValue")) { log.info("Subject=>session[" + value + "]"); } //判断当前的用户是否被认证 if (!currentUser.isAuthenticated()) { //Token :令牌,没有获取,随机 UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa"); token.setRememberMe(true); //设置记住我 try { currentUser.login(token); //执行了登录操作 } catch (UnknownAccountException uae) { //如果 用户名不存在 log.info("There is no user with username of " + token.getPrincipal()); } catch (IncorrectCredentialsException ice) { //如果 密码不正确 log.info("Password for account " + token.getPrincipal() + " was incorrect!"); } catch (LockedAccountException lae) { //用户被锁定,如密码输出过多,则被锁定 log.info("The account for username " + token.getPrincipal() + " is locked. " + "Please contact your administrator to unlock it."); } //...在此处捕获更多异常 catch (AuthenticationException ae) { //意外情况 ? 错误 ? } } //打印其标识主体(在这种情况下,为用户名) log.info("User [" + currentUser.getPrincipal() + "] logged in successfully."); //测试角色是否存在 if (currentUser.hasRole("schwartz")) { log.info("May the Schwartz be with you!"); } else { log.info("Hello, mere mortal."); } //粗粒度,极限范围小 //测试类型化的极限(不是实例级别) if (currentUser.isPermitted("lightsaber:wield")) { log.info("You may use a lightsaber ring. Use it wisely."); } else { log.info("Sorry, lightsaber rings are for schwartz masters only."); } //细粒度,极限范围广 //实例级别的权限(非常强大) if (currentUser.isPermitted("winnebago:drive:eagle5")) { log.info("You are permitted to 'drive' the winnebago with license plate (id) 'eagle5'. " + "Here are the keys - have fun!"); } else { log.info("Sorry, you aren't allowed to drive the 'eagle5' winnebago!"); } //注销 currentUser.logout(); //退出 System.exit(0); } }
3. SpringBoot는 Shiro를 통합합니다
1. 지금 바로 상위 프로젝트에 새로운 springboot 모듈을 생성하세요
2. 및 Shiro 통합 패키지<!--SpringBoot 和 Shiro 整合包--> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4.1</version> </dependency>

주제 사용자-> ShiroFilterFactoryBean
SecurityManager가 모든 사용자를 관리합니다-> DefaultWebSecurityManager
3. AuthorizingRealm
객체 생성 순서 실제 작업: realm -> securityManager -> subject
//自定义的 UserRealm extends AuthorizingRealm public class UserRealm extends AuthorizingRealm { //授权 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { //打印一个提示 System.out.println("执行了授权方法"); return null; } //认证 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { //打印一个提示 System.out.println("执行了认证方法"); return null; } }
4을 상속해야 하는 사용자 정의 영역을 작성합니다.
@Configuration public class ShiroConfig { //ShiroFilterFactoryBean:3 @Bean public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager defaultWebsecurityManager){ ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean(); //设置安全管理器 bean.setSecurityManager(defaultWebsecurityManager); return bean; } //DefaultWebSecurityManager:2 @Bean(name="securityManager") public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){ DefaultWebSecurityManager securityManager=new DefaultWebSecurityManager(); //关闭UserRealm securityManager.setRealm(userRealm); return securityManager; } //创建realm 对象,需要自定义类:1 @Bean(name="userRealm") public UserRealm userRealm(){ return new UserRealm(); } }
5.
2.1. 로그인 차단 사용
getShiroFilterFactoryBean 메소드에서 차단해야 하는 로그인 요청 추가
@Configuration public class ShiroConfig { //ShiroFilterFactoryBean:3 @Bean public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager defaultWebsecurityManager){ ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean(); //设置安全管理器 bean.setSecurityManager(defaultWebsecurityManager); //添加shiro的内置过滤器 /* anon : 无需认证,就可以访问 authc : 必须认证了才能访问 user : 必须拥有 “记住我” 功能才能用 perms : 拥有对某个资源的权限才能访问 role : 拥有某个角色权限才能访问 */ filterMap.put("/user/add","authc"); filterMap.put("/user/update","authc"); //拦截 Map<String,String> filterMap=new LinkedHashMap<>(); filterMap.put("/user/*","authc"); bean.setFilterChainDefinitionMap(filterMap); // //设置登录的请求 // bean.setLoginUrl("/toLogin"); return bean; }
테스트: 추가 링크를 클릭하면 추가 페이지로 이동하지 않고 이동합니다. 로그인 페이지에서 Success
2. 사용자 인증1. Controller 레이어에 로그인 메소드를 작성합니다
//登录的方法 @RequestMapping("/login") public String login(String username, String password, Model model) { //获取当前用户 Subject subject = SecurityUtils.getSubject(); //封装用户的登录数据,获得令牌 UsernamePasswordToken token = new UsernamePasswordToken(username, password); //登录 及 异常处理 try { //执行用户登录的方法,如果没有异常就说明OK了 subject.login(token); return "index"; } catch (UnknownAccountException e) { //如果用户名不存在 System.out.println("用户名不存在"); model.addAttribute("msg", "用户名错误"); return "login"; } catch (IncorrectCredentialsException ice) { //如果密码错误 System.out.println("密码错误"); model.addAttribute("msg", "密码错误"); return "login"; } } }
2. Custom에서 AuthenticationInfo 메소드를 볼 수 있습니다. UserRealm이 먼저 실행된 후 로그인 관련 작업을 수행합니다
3. UserRealm
//认证 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { //打印一个提示 System.out.println("执行了认证方法"); // 用户名密码 String name = "root"; String password = "123456"; //通过参数获取登录的控制器中生成的 令牌 UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken; //用户名认证 if (!token.getUsername().equals(name)){ // return null UnKnownAccountException return null; } //密码认证, Shiro 自己做,为了避免和密码的接触 //最后返回一个 AuthenticationInfo 接口的实现类,这里选择 SimpleAuthenticationInfo // 三个参数:获取当前用户的认证 ; 密码 ; 认证名 return new SimpleAuthenticationInfo("", password, ""); } }
4에서 doGetAuthenticationInfo 메소드를 수정합니다. 테스트하고 잘못된 비밀번호를 입력합니다
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.19</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.12</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.1</version> </dependency>

spring: datasource: username: root password: 123456 url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource #Spring Boot 默认是不注入这些属性值的,需要自己绑定 #druid 数据源专有配置 initialSize: 5 minIdle: 5 maxActive: 20 maxWait: 60000 timeBetweenEvictionRunsMillis: 60000 minEvictableIdleTimeMillis: 300000 validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: false testOnReturn: false poolPreparedStatements: true #配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入 #如果允许时报错 java.lang.ClassNotFoundException: org.apache.log4j.Priority #则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j filters: stat,wall,log4j maxPoolPreparedStatementPerConnectionSize: 20 useGlobalDataSourceStat: true connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500 mybatis: type-aliases-package: com.huang.pojo mapper-locations: classpath:mybatis/mapper/*.xml
4에서 새로운 application.yml을 생성합니다.
mybatis.type-aliases-package=com.longdi.pojo mybatis.mapper-locations=classpath:mapper/*.xml5.
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> <scope>provided</scope> </dependency>.6 . 데이터베이스에 성공적으로 연결됩니다. 1. ShiroConfig 클래스에서 수정합니다.
3. 로그인하여 인증을 성공합니다.
4. 쓰기 인증 doGetAuthorizationInfo 메소드
5. 요청 인증 테스트 성공 6. Shiro가 Thymeleaf1 가져오기 종속성@Data @AllArgsConstructor @NoArgsConstructor public class User { private int id; private String name; private String pwd; private String perms; }2을 통합합니다. 3.index. html
4. Test
5. index.html
을 수정하세요.
위 내용은 Java에서 Apache Shiro 보안 프레임워크를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

이 기사에서는 Java 프로젝트 관리, 구축 자동화 및 종속성 해상도에 Maven 및 Gradle을 사용하여 접근 방식과 최적화 전략을 비교합니다.

이 기사에서는 Maven 및 Gradle과 같은 도구를 사용하여 적절한 버전 및 종속성 관리로 사용자 정의 Java 라이브러리 (JAR Files)를 작성하고 사용하는 것에 대해 설명합니다.

이 기사는 카페인 및 구아바 캐시를 사용하여 자바에서 다단계 캐싱을 구현하여 응용 프로그램 성능을 향상시키는 것에 대해 설명합니다. 구성 및 퇴거 정책 관리 Best Pra와 함께 설정, 통합 및 성능 이점을 다룹니다.

이 기사는 캐싱 및 게으른 하중과 같은 고급 기능을 사용하여 객체 관계 매핑에 JPA를 사용하는 것에 대해 설명합니다. 잠재적 인 함정을 강조하면서 성능을 최적화하기위한 설정, 엔티티 매핑 및 모범 사례를 다룹니다. [159 문자]

Java의 클래스 로딩에는 부트 스트랩, 확장 및 응용 프로그램 클래스 로더가있는 계층 적 시스템을 사용하여 클래스로드, 링크 및 초기화 클래스가 포함됩니다. 학부모 위임 모델은 핵심 클래스가 먼저로드되어 사용자 정의 클래스 LOA에 영향을 미치도록합니다.

이 기사에서는 분산 응용 프로그램을 구축하기위한 Java의 원격 메소드 호출 (RMI)에 대해 설명합니다. 인터페이스 정의, 구현, 레지스트리 설정 및 클라이언트 측 호출을 자세히 설명하여 네트워크 문제 및 보안과 같은 문제를 해결합니다.

이 기사는 네트워크 통신을위한 Java의 소켓 API, 클라이언트 서버 설정, 데이터 처리 및 리소스 관리, 오류 처리 및 보안과 같은 중요한 고려 사항에 대해 자세히 설명합니다. 또한 성능 최적화 기술, i

이 기사에서는 맞춤형 Java 네트워킹 프로토콜을 작성합니다. 프로토콜 정의 (데이터 구조, 프레임, 오류 처리, 버전화), 구현 (소켓 사용), 데이터 직렬화 및 모범 사례 (효율성, 보안, Mainta를 포함합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

Dreamweaver Mac版
시각적 웹 개발 도구

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경
