So verwenden Sie das Apache Shiro-Sicherheitsframework in Java
1. Einführung in Shiro:
Apache Shiro ist ein Java-Sicherheits-(Berechtigungs-)Framework.
Shiro macht es sehr einfach, ausreichend gute Anwendungen zu entwickeln, die nicht nur in der JavaSE-Umgebung, sondern auch in der JavaEE-Umgebung verwendet werden können. Shiro kann alles: Authentifizierung, Autorisierung, Verschlüsselung, Sitzungsverwaltung, Webintegration, Caching und mehr.
shiro-Funktionen:
Authentifizierung: Identitätsauthentifizierung, Anmeldung, Überprüfung, ob der Benutzer über die entsprechende Identität verfügt;
Autorisierung: Autorisierung, d. h. Berechtigungsüberprüfung, Überprüfung, ob ein authentifizierter Benutzer über bestimmte Berechtigungen verfügt , das heißt, es wird bestimmt, welche Vorgänge ein Benutzer ausführen kann, z. B.: Überprüfen, ob ein Benutzer eine bestimmte Rolle hat, oder differenzierte Überprüfung, ob ein Benutzer eine bestimmte Berechtigung für eine bestimmte Ressource hat
Sitzungsmanager: Sitzungsverwaltung, das heißt , Benutzer Nach dem Anmelden handelt es sich um die erste Sitzung. Vor dem Abmelden können sich alle Informationen in der Sitzung befinden.
Kryptografie: Verschlüsselung, Schutz der Datensicherheit Passwortverschlüsselung. Wird in der Datenbank statt im Klartext gespeichert Dies kann die Effizienz verbessern.
Parallelität: Shiro unterstützt die gleichzeitige Überprüfung von Multithread-Anwendungen. Das heißt, wenn Sie einen anderen Thread in einem Thread starten, können die Berechtigungen automatisch an ihn weitergegeben werden.
Testen: Testen support;
Ausführen als: Ermöglicht einem Benutzer, Zugriff als ein anderer Benutzer vorzutäuschen (sofern er dies zulässt);
An mich erinnern: An mich erinnern, dies ist eine sehr häufige Funktion, das heißt, nach einmaliger Anmeldung ist dies nicht mehr erforderlich Melden Sie sich das nächste Mal an
SecurityManager: Sicherheitsmanager, das heißt, alle sicherheitsrelevanten Vorgänge interagieren mit SecurityManager. und es verwaltet alle Subjekte. Es ist ersichtlich, dass es der Kern von Shiro ist und für die Interaktion mit anderen Komponenten von Shiro verantwortlich ist. Es entspricht der Rolle von SpringMVCs
DispatcherServlet
Realm: Shiro erhält Sicherheitsdaten (z. B Das heißt, wenn SecurityManager die Identität des Benutzers überprüfen möchte, muss er zum Vergleich den entsprechenden Benutzer von Realm abrufen, um festzustellen, ob die Identität des Benutzers zulässig ist Die entsprechende Rolle und die Berechtigungen des Benutzers aus dem Bereich, um zu überprüfen, ob der Vorgang des Benutzers als DataSource ausgeführt werden kann; Anwendung;
Sicherheitsmanager: Entspricht dem DispatcherServlet in SpringMVC. Alle spezifischen Interaktionen werden durch den Sicherheitsmanager verwaltet. Er ist für die Authentifizierung, Autorisierung und Cache-Verwaltung verantwortlich.
Authenticator: Verantwortlich für die Betreffauthentifizierung, es ist ein Erweiterungspunkt und kann angepasst werden. Sie können die Authentifizierungsstrategie (AuthenticationStrategy) verwenden, d. h. unter welchen Umständen wird die Benutzerauthentifizierung durchgeführt? Der Controller wird verwendet, um zu bestimmen, ob das Subjekt die Berechtigung hat, entsprechende Vorgänge auszuführen. Das heißt, er steuert, auf welche Funktionen in der Anwendung der Benutzer zugreifen kann.
Realm: Es kann einen oder mehrere Bereiche geben, die als sichere Entitätsdaten betrachtet werden können Die Quelle, die zum Abrufen von Sicherheitsentitäten verwendet wird, kann mithilfe von DBC oder einer vom Benutzer bereitgestellten Speicherimplementierung usw. implementiert werden. Daher müssen Sie in Anwendungen im Allgemeinen Ihren eigenen Bereich implementieren. SessionManager: eine Komponente, die die Sitzungslebensdauer verwaltet Zyklus, und Shiro kann nicht nur in der Webumgebung verwendet werden, sondern auch in der normalen JavaSE-UmgebungCacheManager: Cache-Controller zum Verwalten von Caches wie Benutzern, Rollen, Berechtigungen usw., da auf diese Daten grundsätzlich selten zugegriffen werden kann. Der Zugriff kann verbessert werden, nachdem er in den Cache gestellt wurde. Kryptographie: Kryptographiemodul, Shiro verbessert einige gängige Verschlüsselungskomponenten für Passwortverschlüsselung, Entschlüsselung usw.
2. Schnellstart
2 Erstellen Sie ein neues Maven-Projekt, löschen Sie dessen src-Verzeichnis und verwenden Sie es als übergeordnetes Projekt Neues Maven-Modul im übergeordneten Projekt
<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. Kopieren Sie die log4j.properties unter der Ressource im Schnellstartfall
6. Kopieren Sie den Quickstart. Java-Datei
8. Führen Sie Quickstart.java
2 aus. 3. SpringBoot integriert Shiro
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); } }
Shiro
SecurityManager verwaltet alle Benutzer-> DefaultWebSecurityManager
Realm-Verbindungsdaten2. Verwenden Sie 1. Fügen Sie das erforderliche Abfangen in der getShiroFilterFactoryBean hinzu Methode Anmeldeanforderung3. Erstellen Sie eine neue ShiroConfig-Konfigurationsdatei
#🎜🎜 #5. Test erfolgreich!<!--SpringBoot 和 Shiro 整合包--> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4.1</version> </dependency>Nach dem Login kopieren
//自定义的 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; } }
# 🎜🎜# 2. Benutzerauthentifizierung
1 Schreiben Sie eine Anmeldemethode in der Controller-Ebene
@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(); } }
2. 🎜🎜#
Es ist ersichtlich, dass zuerst die AuthenticationInfo-Methode im angepassten UserRealm ausgeführt wird und dann die anmeldebezogenen Vorgänge ausgeführt werden
3 Ändern Sie die doGetAuthenticationInfo-Methode im UserRealm
@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; }
4. Geben Sie das falsche Passwort ein
#🎜 🎜#Geben Sie das richtige Passwort ein. Sie können sich erfolgreich anmelden.
4. Shiro integriert Mybatis neue application.yml
//登录的方法 @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"; } } }
//认证 @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, ""); } }
<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
mybatis.type-aliases-package=com.longdi.pojo mybatis.mapper-locations=classpath:mapper/*.xml

<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> <scope>provided</scope> </dependency>
8.Service-Schicht
@Data @AllArgsConstructor @NoArgsConstructor public class User { private int id; private String name; private String pwd; private String perms; }
9. Schreiben Sie die Schnittstellenimplementierungsklasse UserServiceImpl
@Repository @Mapper public interface UserMapper { public User queryUserByName(String name); }
10. Testen Sie in ShiroSpringbootApplicationTests
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.longdi.mapper.UserMapper"> <select id="queryUserByName" resultType="User" parameterType="String"> select * from mybatis.user where name=#{name} </select> </mapper>
# 🎜🎜#5. Anforderungsautorisierung implementieren
1. Ändern Sie die ShiroConfig-Klasse2 #
#🎜 🎜#
3. Anmelden, um Autorisierung abzufangen, Test erfolgreich
4. Autorisierungsmethode doGetAuthorizationInfo schreiben
5. Autorisierungstest erfolgreich anfordern
6. Shiro integriert Thymeleaf
1. Abhängigkeiten importieren
public interface UserService { public User queryUserByName(String name); }
2. ShiroDialect integrieren
3. index.html
# 🎜🎜#
# in der Authentifizierung 🎜🎜#
6. Ändern Sie index.html
Das obige ist der detaillierte Inhalt vonSo verwenden Sie das Apache Shiro-Sicherheitsframework in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

Java leicht gemacht: Ein Leitfaden für Anfänger zur leistungsstarken Programmierung Java ist eine leistungsstarke Programmiersprache, die in allen Bereichen von mobilen Anwendungen bis hin zu Systemen auf Unternehmensebene verwendet wird. Für Anfänger ist die Syntax von Java einfach und leicht zu verstehen, was es zu einer idealen Wahl zum Erlernen des Programmierens macht. Grundlegende Syntax Java verwendet ein klassenbasiertes objektorientiertes Programmierparadigma. Klassen sind Vorlagen, die zusammengehörige Daten und Verhaltensweisen organisieren. Hier ist ein einfaches Java-Klassenbeispiel: publicclassPerson{privateStringname;privateintage;

Java ist eine beliebte Programmiersprache, die sowohl von Anfängern als auch von erfahrenen Entwicklern erlernt werden kann. Dieses Tutorial beginnt mit grundlegenden Konzepten und geht dann weiter zu fortgeschrittenen Themen. Nach der Installation des Java Development Kit können Sie das Programmieren üben, indem Sie ein einfaches „Hello, World!“-Programm erstellen. Nachdem Sie den Code verstanden haben, verwenden Sie die Eingabeaufforderung, um das Programm zu kompilieren und auszuführen. Auf der Konsole wird „Hello, World!“ ausgegeben. Mit dem Erlernen von Java beginnt Ihre Programmierreise, und wenn Sie Ihre Kenntnisse vertiefen, können Sie komplexere Anwendungen erstellen.

Kapseln sind dreidimensionale geometrische Figuren, die aus einem Zylinder und einer Hemisphäre an beiden Enden bestehen. Das Volumen der Kapsel kann berechnet werden, indem das Volumen des Zylinders und das Volumen der Hemisphäre an beiden Enden hinzugefügt werden. In diesem Tutorial wird erörtert, wie das Volumen einer bestimmten Kapsel in Java mit verschiedenen Methoden berechnet wird. Kapselvolumenformel Die Formel für das Kapselvolumen lautet wie folgt: Kapselvolumen = zylindrisches Volumenvolumen Zwei Hemisphäre Volumen In, R: Der Radius der Hemisphäre. H: Die Höhe des Zylinders (ohne die Hemisphäre). Beispiel 1 eingeben Radius = 5 Einheiten Höhe = 10 Einheiten Ausgabe Volumen = 1570,8 Kubikeinheiten erklären Berechnen Sie das Volumen mithilfe der Formel: Volumen = π × R2 × H (4

Spring Boot vereinfacht die Schaffung robuster, skalierbarer und produktionsbereiteter Java-Anwendungen, wodurch die Java-Entwicklung revolutioniert wird. Der Ansatz "Übereinkommen über Konfiguration", der dem Feder -Ökosystem inhärent ist, minimiert das manuelle Setup, Allo

Ein Stapel ist eine Datenstruktur, die dem LIFO -Prinzip (zuletzt, zuerst heraus) folgt. Mit anderen Worten, das letzte Element, das wir einem Stapel hinzufügen, ist das erste, das entfernt wird. Wenn wir einem Stapel Elemente hinzufügen (oder drücken), werden sie oben platziert. vor allem der

Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.
