Apache Shiro 사용자 매뉴얼 (3) Shiro 인증
승인은 사용자가 애플리케이션의 리소스에 대한 해당 액세스 권한을 가지고 있는지 여부를 결정하는 액세스 제어입니다.
예를 들어 사용자에게 페이지 보기 권한, 데이터 편집 권한, 특정 버튼 보유 권한, 인쇄 권한 등이 있는지 확인합니다.
1. 권한 부여의 세 가지 요소
권한에는 권한, 역할, 사용자라는 세 가지 핵심 요소가 있습니다.
권한
권한은 Apache Shiro 보안 메커니즘의 핵심 요소입니다. 이는 애플리케이션에서 허용되는 동작과 성능을 명확하게 명시합니다. 올바른 형식의 권한 설명은 사용자가 해당 리소스에 대해 갖고 있는 권한을 명확하게 전달합니다.
대부분의 리소스는 일반적인 CRUD 작업(생성, 읽기, 업데이트, 삭제)을 지원하지만 모든 작업은 특정 리소스를 기반으로 하는 것이 합리적입니다. 따라서 허가 선언의 기본 아이디어는 자원과 운영을 기반으로 합니다.
권한 선언을 통해 이 권한이 애플리케이션에서 수행할 수 있는 작업만 이해할 수 있지만 누가 이 권한을 가지고 있는지 확인할 수는 없습니다.
따라서 애플리케이션에서 사용자와 권한을 연결해야 합니다.
일반적인 접근 방식은 역할에 권한을 할당한 다음 이 역할을 한 명 이상의 사용자와 연결하는 것입니다.
권한 선언 및 세분성
Shiro 권한 선언은 일반적으로 콜론으로 구분된 표현을 사용합니다. 앞서 언급했듯이 권한 표현식은 리소스 유형, 허용되는 작업 및 액세스 가능한 데이터를 명확하게 지정할 수 있습니다. 동시에 Shiro 권한 표현은 간단한 와일드카드를 지원하므로 보다 유연한 권한 설정이 가능합니다.
다음에서는 예를 사용하여 권한 표현을 설명합니다.
사용자 데이터 조회 가능
User:view
사용자 데이터 조회 또는 편집 가능
User:view,edit
수정 가능 사용자 데이터는 모든 작업을 수행합니다.
User:* 또는 사용자
는 ID 123
User:edit:123
역할
으로 사용자 데이터를 편집할 수 있습니다.
Shiro는 두 가지 역할 모드를 지원합니다.
1. 기존 역할: 작업을 승인하고 확인해야 하는 경우 역할이 가능한지 여부만 결정하면 됩니다. . 이러한 종류의 역할 권한은 상대적으로 단순하고 모호하여 확장에 도움이 되지 않습니다.
2. 권한 역할: 역할에는 일련의 권한이 있습니다. 권한 확인 중에 현재 역할에 권한이 있는지 확인해야 합니다. 이러한 종류의 역할 권한은 역할에 대한 자세한 권한 설명을 제공할 수 있으며 보다 복잡한 권한 설계에 적합합니다.
두 가지 역할 모드의 권한 부여 구현은 아래에서 자세히 설명합니다.
2. 인증 구현
Shiro는 인증 프로세스를 구현하는 세 가지 방법을 지원합니다:
코딩 구현
주석 구현
JSP Taglig 구현
1. 코딩 기반 권한 구현
1.1 기존 역할 기반 권한 구현
사용자가 특정 역할을 가지고 있는지 확인해야 할 경우 Subject의 hasRole* 메소드를 호출할 수 있습니다. 확인할 인스턴스입니다.
관련 확인 방법은 다음과 같습니다.
제목 방법 ~ 🎜>
hasRoles(ListSubject currentUser = SecurityUtils.getSubject(); if (currentUser.hasRole("administrator")) { //show the admin button } else { //don't show the button? Grey it out? }
관련 방법 주장:
주제 방법 세번 Roles(Collection
org.apache.shiro.authz.Permission 인스턴스를 생성합니다. 인스턴스 객체는 확인을 위해 Subject.isPermitted()에 매개변수로 전달됩니다.
Subject currentUser = SecurityUtils.getSubject(); //guarantee that the current user is a bank teller and //therefore allowed to open the account: currentUser.checkRole("bankTeller"); openBankAccount();
관련 메소드는 다음과 같습니다.
주체 메소드 설명
isPermitted(Permission p) Subject가 지정된 권한을 가질 때 treu는 돌아왔습니다
isPermitted(List
isPermittedAll(Collection
2、 基于字符串的实现
相比笨重的基于对象的实现方式,基于字符串的实现便显得更加简洁。
Subject currentUser = SecurityUtils.getSubject(); if (currentUser.isPermitted("printer:print:laserjet4400n")) { //show the Print button } else { //don't show the button? Grey it out? }
使用冒号分隔的权限表达式是org.apache.shiro.authz.permission.WildcardPermission 默认支持的实现方式。
这里分别代表了 资源类型:操作:资源ID
类似基于对象的实现相关方法,基于字符串的实现相关方法:
isPermitted(String perm)、isPermitted(String... perms)、isPermittedAll(String... perms)
基于权限对象的断言实现
Subject currentUser = SecurityUtils.getSubject(); //guarantee that the current user is permitted //to open a bank account: Permission p = new AccountPermission("open"); currentUser.checkPermission(p); openBankAccount();
基于字符串的断言实现
Subject currentUser = SecurityUtils.getSubject(); //guarantee that the current user is permitted //to open a bank account: currentUser.checkPermission("account:open"); openBankAccount();
断言实现的相关方法
Subject方法 说明
checkPermission(Permission p) 断言用户是否拥有制定权限
checkPermission(String perm) 断言用户是否拥有制定权限
checkPermissions(Collection
checkPermissions(String... perms) 断言用户是否拥有所有指定权限
2、基于注解的授权实现
Shiro注解支持AspectJ、Spring、Google-Guice等,可根据应用进行不同的配置。
相关的注解:
@ RequiresAuthentication
可以用户类/属性/方法,用于表明当前用户需是经过认证的用户。
@RequiresAuthentication public void updateAccount(Account userAccount) { //this method will only be invoked by a //Subject that is guaranteed authenticated ... } @ RequiresGuest
表明该用户需为”guest”用户
@ RequiresPermissions
当前用户需拥有制定权限
@RequiresPermissions("account:create") public void createAccount(Account account) { //this method will only be invoked by a Subject //that is permitted to create an account ... } @RequiresRoles
当前用户需拥有制定角色
@ RequiresUser
当前用户需为已认证用户或已记住用户
3、基于JSP TAG的授权实现
Shiro提供了一套JSP标签库来实现页面级的授权控制。
在使用Shiro标签库前,首先需要在JSP引入shiro标签:
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
下面一一介绍Shiro的标签:
guest标签
验证当前用户是否为“访客”,即未认证(包含未记住)的用户
<shiro:guest> Hi there! Please <a href="login.jsp">Login</a> or <a href="signup.jsp">Signup</a> today! </shiro:guest>
user标签
认证通过或已记住的用户
<shiro:user> Welcome back John! Not John? Click <a href="login.jsp">here<a> to login. </shiro:user>
authenticated标签
已认证通过的用户。不包含已记住的用户,这是与user标签的区别所在。
<shiro:authenticated> <a href="updateAccount.jsp">Update your contact information</a>. </shiro:authenticated> notAuthenticated标签
未认证通过用户,与authenticated标签相对应。与guest标签的区别是,该标签包含已记住用户。
<shiro:notAuthenticated> Please <a href="login.jsp">login</a> in order to update your credit card information. </shiro:notAuthenticated>
principal 标签
输出当前用户信息,通常为登录帐号信息
Hello, <shiro:principal/>, how are you today?
验证当前用户是否属于该角色
<shiro:hasRole name="administrator"> <a href="admin.jsp">Administer the system</a> </shiro:hasRole>
lacksRole标签
与hasRole标签逻辑相反,当用户不属于该角色时验证通过
<shiro:lacksRole name="administrator"> Sorry, you are not allowed to administer the system. </shiro:lacksRole>
hasAnyRole标签
验证当前用户是否属于以下任意一个角色。
<shiro:hasAnyRoles name="developer, project manager, administrator"> You are either a developer, project manager, or administrator. </shiro:lacksRole>
hasPermission标签
验证当前用户是否拥有制定权限
<shiro:hasPermission name="user:create"> <a href="createUser.jsp">Create a new User</a> </shiro:hasPermission>
lacksPermission标签
与hasPermission标签逻辑相反,当前用户没有制定权限时,验证通过
<shiro:hasPermission name="user:create"> <a href="createUser.jsp">Create a new User</a> </shiro:hasPermission>
三、Shiro授权的内部处理机制
1、在应用程序中调用授权验证方法(Subject的isPermitted*或hasRole*等)
2、Sbuject的实例通常是DelegatingSubject类(或子类)的实例对象,在认证开始时,会委托应用程序设置的securityManager实例调用相应的isPermitted*或hasRole*方法。
3、接下来SecurityManager会委托内置的Authorizer的实例(默认是ModularRealmAuthorizer 类的实例,类似认证实例,它同样支持一个或多个Realm实例认证)调用相应的授权方法。
4、每一个Realm将检查是否实现了相同的 Authorizer 接口。然后,将调用Reaml自己的相应的授权验证方法。
当使用多个Realm时,不同于认证策略处理方式,授权处理过程中:
1、当调用Realm出现异常时,将立即抛出异常,结束授权验证。
2、只要有一个Realm验证成功,那么将认为授权成功,立即返回,结束认证。
以上就是Apache Shiro 使用手册(三)Shiro 授权的内容,更多相关内容请关注PHP中文网(www.php.cn)!

핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

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

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











H5 프로젝트를 실행하려면 다음 단계가 필요합니다. Web Server, Node.js, 개발 도구 등과 같은 필요한 도구 설치. 개발 환경 구축, 프로젝트 폴더 작성, 프로젝트 초기화 및 코드 작성. 개발 서버를 시작하고 명령 줄을 사용하여 명령을 실행하십시오. 브라우저에서 프로젝트를 미리보고 개발 서버 URL을 입력하십시오. 프로젝트 게시, 코드 최적화, 프로젝트 배포 및 웹 서버 구성을 설정하십시오.

서버 측에서 문자 인코딩을 설정하려면 Bridble Bootstrap 테이블을 해결하려면 다음 단계를 따라야합니다. 서버 문자 인코딩을 확인하십시오. 서버 구성 파일 편집; 인코딩을 UTF-8로 설정하십시오. 서버를 저장하고 다시 시작합니다. 인코딩을 확인하십시오.

Apache에서 CGI 디렉토리를 설정하려면 다음 단계를 수행해야합니다. "CGI-BIN"과 같은 CGI 디렉토리를 작성하고 Apache 쓰기 권한을 부여하십시오. Apache 구성 파일에 "Scriptalias"지시록 블록을 추가하여 CGI 디렉토리를 "/cgi-bin"URL에 매핑하십시오. Apache를 다시 시작하십시오.

Apache를 시작하는 단계는 다음과 같습니다. Apache 설치 (명령 : Sudo apt-get Apache2를 설치하거나 공식 웹 사이트에서 다운로드) 시작 apache (linux : sudo systemctl start : windes (선택 사항, Linux : Sudo SystemCtl

이 기사는 데비안 시스템의 OpenSSL 구성을 확인하여 시스템의 보안 상태를 신속하게 파악하는 데 도움이되는 몇 가지 방법을 소개합니다. 1. OpenSSL 버전을 먼저 확인하고 OpenSSL이 설치되었는지 확인 및 버전 정보를 확인하십시오. 터미널에 다음 명령을 입력하십시오. OpenSSLVERSION이 설치되지 않으면 시스템에 오류가 발생합니다. 2. 구성 파일을 봅니다. OpenSSL의 기본 구성 파일은 일반적으로 /etc/ssl/openssl.cnf에 있습니다. 텍스트 편집기 (예 : Nano)를 사용하여 Sudonano/etc/ssl/openssl.cnf이 파일에는 키, 인증서 경로 및 암호화 알고리즘과 같은 중요한 구성 정보가 포함되어 있습니다. 3. Ope를 활용하십시오

이 기사는 데비안 시스템에서 Apache Logs를 분석하여 웹 사이트 성능을 향상시키는 방법을 설명합니다. 1. 로그 분석 기본 사항 Apache Log는 IP 주소, 타임 스탬프, 요청 URL, HTTP 메소드 및 응답 코드를 포함한 모든 HTTP 요청의 자세한 정보를 기록합니다. 데비안 시스템 에서이 로그는 일반적으로 /var/log/apache2/access.log 및 /var/log/apache2/error.log 디렉토리에 있습니다. 로그 구조를 이해하는 것은 효과적인 분석의 첫 번째 단계입니다. 2. 로그 분석 도구 다양한 도구를 사용하여 Apache 로그를 분석 할 수 있습니다.

Apache에서 추가 ServerName 지시문을 삭제하려면 다음 단계를 수행 할 수 있습니다. 추가 ServerName Directive를 식별하고 삭제하십시오. Apache를 다시 시작하여 변경 사항이 적용됩니다. 구성 파일을 확인하여 변경 사항을 확인하십시오. 서버를 테스트하여 문제가 해결되었는지 확인하십시오.

Apache는 데이터베이스에 연결하여 다음 단계가 필요합니다. 데이터베이스 드라이버 설치. 연결 풀을 만들려면 Web.xml 파일을 구성하십시오. JDBC 데이터 소스를 작성하고 연결 설정을 지정하십시오. JDBC API를 사용하여 Connections, 명세서 작성, 매개 변수 바인딩, 쿼리 또는 업데이트 실행 및 처리를 포함하여 Java 코드의 데이터베이스에 액세스하십시오.
