찾다
Javajava지도 시간Java에서 Apache Shiro 보안 프레임워크를 사용하는 방법

    1. Shiro 소개:

    Apache Shiro는 Java 보안(권한) 프레임워크입니다.
    Shiro를 사용하면 JavaSE 환경뿐만 아니라 JavaEE 환경에서도 사용할 수 있는 충분한 애플리케이션을 매우 쉽게 개발할 수 있습니다. Shiro는 인증, 권한 부여, 암호화, 세션 관리, 웹 통합, 캐싱 등 모든 작업을 수행할 수 있습니다.

    Java에서 Apache Shiro 보안 프레임워크를 사용하는 방법

    shiro 기능:

    Java에서 Apache Shiro 보안 프레임워크를 사용하는 방법

    인증: 신원 인증, 로그인, 사용자가 해당 신원을 가지고 있는지 확인
    인증: 승인, 즉 권한 확인, 인증된 사용자에게 특정 권한이 있는지 확인; 즉, 사용자가 특정 역할을 가지고 있는지 확인하거나 사용자가 특정 리소스에 대해 특정 권한을 가지고 있는지 세부적으로 확인하는 등 사용자가 수행할 수 있는 작업을 결정합니다.
    세션 관리자: 세션 관리, 즉! , 사용자 로그인 후 첫 번째 세션입니다. 모든 정보는 세션에 있습니다. 세션은 일반 JavaSE 환경 또는 웹 환경일 수 있습니다.
    암호화, 데이터 보안 보호; 비밀번호 암호화 일반 텍스트 대신 데이터베이스에 저장됨 웹 지원: 웹 환경에 쉽게 통합될 수 있음
    캐싱: 예를 들어 사용자가 로그인한 후 사용자 정보, 역할 및 권한이 저장됩니다. 매번 확인할 필요가 없습니다. 이는 효율성을 향상시킬 수 있습니다
    동시성: Shiro는 다중 스레드 응용 프로그램의 동시 확인을 지원합니다. 즉, 한 스레드에서 다른 스레드를 시작하면 권한이 자동으로 해당 스레드에 전파될 수 있습니다.
    테스트: 테스트 제공 support;
    다음 계정으로 실행: 사용자가 액세스를 다른 사용자로 가장하도록 허용합니다(허용하는 경우)
    기억하기: 기억하세요. 이것은 매우 일반적인 기능입니다. 즉, 한 번 로그인한 후에는 그럴 필요가 없습니다. 다음에 로그인하세요

    Shiro 아키텍처(외부)

    외부에서 Shiro를 바라보기, 즉 애플리케이션 관점에서 작업을 완료하기 위해 shiro를 사용하는 방법을 관찰하기:

    Java에서 Apache Shiro 보안 프레임워크를 사용하는 방법

    제목: 애플리케이션이 수행하는 개체 즉, Shiro의 외부 API의 핵심은 주제이고 주제는 현재 사용자를 나타냅니다. 이 사용자는 웹 크롤러와 같이 반드시 특정 사람일 필요는 없습니다. Subject와의 모든 상호 작용은 SecurityManager에 위임됩니다. Subject는 실제로 Facade이고 SecurityManageer는 실제 실행자입니다.
    SecurityManager: Security Manager, 즉 모든 보안 관련 작업은 SecurityManager와 상호 작용하고 모든 것을 관리합니다. Subjects Shiro의 핵심이며 Shiro의 다른 구성 요소와의 상호 작용을 담당한다고 볼 수 있습니다. 이는 SpringMVC의
    DispatcherServlet
    Realm의 역할과 동일합니다. Shiro는 보안 데이터(예: 사용자, 역할, 즉, SecurityManager가 사용자의 신원을 확인하려면 사용자의 신원이 합법적인지 확인하기 위해 Realm에서 해당 사용자를 가져와야 합니다. Realm에서 사용자의 작업을 수행할 수 있는지 확인하기 위한 권한입니다.

    Shiro 아키텍처(내부)

    Java에서 Apache Shiro 보안 프레임워크를 사용하는 방법

    주제: 애플리케이션과 상호 작용하는 '사용자'; 관리자: SpringMVC의 DispatcherServlet과 동일하며 모든 특정 상호 작용은 보안 관리자를 통해 제어되며 인증, 승인 및 세션을 담당합니다. 주체 인증의 경우 확장 지점이며 사용자 정의할 수 있습니다. 즉, 어떤 상황에서 사용자 인증이 통과되는지 확인하는 데 사용됩니다. 주체가 해당 작업을 수행할 권한이 있는지 여부, 즉 사용자가 애플리케이션에서 액세스할 수 있는 기능을 제어합니다.
    영역: 보안 엔터티 데이터 소스로 간주될 수 있는 하나 이상의 영역이 있을 수 있습니다. 보안 엔터티를 얻는 데 사용되는 것은 사용자가 제공하는 DBC 또는 메모리 구현 등을 사용하여 구현할 수 있으므로 일반적으로 애플리케이션에서는 자체 영역을 구현해야 합니다.

    SessionManager: 세션 수명 주기를 관리하는 구성 요소이며 Shiro는 웹 환경뿐만 아니라 일반 JavaSE 환경에서도 사용할 수 있습니다.

    CacheManager: 사용자, 역할, 권한 등의 캐시를 관리하는 캐시 컨트롤러. 이러한 데이터는 기본적으로 거의 액세스할 수 없으므로 이후에 액세스가 향상될 수 있습니다.
    암호화 모듈, Shiro는 비밀번호 암호화, 암호 해독 등을 위한 몇 가지 일반적인 암호화 구성 요소를 개선합니다.

    2. 빠른 시작

    1. 공식 웹사이트의 메시지를 따릅니다. 빠른 시작 사례 GitHub 주소를 찾으세요: shiro/samples/quickstart/

    2. 새 Maven 프로젝트를 만들고 해당 src 디렉터리를 삭제한 후 상위 프로젝트로 사용하세요

    3. 상위 프로젝트

    Java에서 Apache Shiro 보안 프레임워크를 사용하는 방법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

    를 실행하고 시작합니다.

    Java에서 Apache Shiro 보안 프레임워크를 사용하는 방법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 &#39;drive&#39; the winnebago with license plate (id) &#39;eagle5&#39;.  " +
                        "Here are the keys - have fun!");
            } else {
                log.info("Sorry, you aren&#39;t allowed to drive the &#39;eagle5&#39; 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>
    Java에서 Apache Shiro 보안 프레임워크를 사용하는 방법다음은 구성 파일 작성을 위한 세 가지 주요 요소입니다

    Shiro

    주제 사용자-> ShiroFilterFactoryBean
    SecurityManager가 모든 사용자를 관리합니다-> DefaultWebSecurityManager

    Realm 연결 데이터


    객체 생성 순서 실제 작업: realm -> securityManager -> subject

    3. AuthorizingRealm
    //自定义的 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.

    Java에서 Apache Shiro 보안 프레임워크를 사용하는 방법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. 사용자 인증

    Java에서 Apache Shiro 보안 프레임워크를 사용하는 방법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 메소드를 수정합니다. 테스트하고 잘못된 비밀번호를 입력합니다

    Java에서 Apache Shiro 보안 프레임워크를 사용하는 방법

    올바른 비밀번호를 입력하면 로그인됩니다. 성공적으로

    4. Shiro는 Mybatis를 통합합니다.

    <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>
    Java에서 Apache Shiro 보안 프레임워크를 사용하는 방법2. application.properties

    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을 생성합니다.Java에서 Apache Shiro 보안 프레임워크를 사용하는 방법

    mybatis.type-aliases-package=com.longdi.pojo
    mybatis.mapper-locations=classpath:mapper/*.xml

    5.
    <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가 Thymeleaf

    1 가져오기 종속성

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class User {
            private int id;
            private String name;
            private String pwd;
            private String perms;
    }

    2을 통합합니다.

    3.index. html

    4. Test

    Java에서 Apache Shiro 보안 프레임워크를 사용하는 방법5. index.html

    을 수정하세요.

    위 내용은 Java에서 Apache Shiro 보안 프레임워크를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명
    이 기사는 亿速云에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
    고급 Java 프로젝트 관리, 구축 자동화 및 종속성 해상도에 Maven 또는 Gradle을 어떻게 사용합니까?고급 Java 프로젝트 관리, 구축 자동화 및 종속성 해상도에 Maven 또는 Gradle을 어떻게 사용합니까?Mar 17, 2025 pm 05:46 PM

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

    적절한 버전 및 종속성 관리로 Custom Java 라이브러리 (JAR Files)를 작성하고 사용하려면 어떻게해야합니까?적절한 버전 및 종속성 관리로 Custom Java 라이브러리 (JAR Files)를 작성하고 사용하려면 어떻게해야합니까?Mar 17, 2025 pm 05:45 PM

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

    카페인 또는 구아바 캐시와 같은 라이브러리를 사용하여 자바 애플리케이션에서 다단계 캐싱을 구현하려면 어떻게해야합니까?카페인 또는 구아바 캐시와 같은 라이브러리를 사용하여 자바 애플리케이션에서 다단계 캐싱을 구현하려면 어떻게해야합니까?Mar 17, 2025 pm 05:44 PM

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

    캐싱 및 게으른 하중과 같은 고급 기능을 사용하여 객체 관계 매핑에 JPA (Java Persistence API)를 어떻게 사용하려면 어떻게해야합니까?캐싱 및 게으른 하중과 같은 고급 기능을 사용하여 객체 관계 매핑에 JPA (Java Persistence API)를 어떻게 사용하려면 어떻게해야합니까?Mar 17, 2025 pm 05:43 PM

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

    Java의 클래스로드 메커니즘은 다른 클래스 로더 및 대표 모델을 포함하여 어떻게 작동합니까?Java의 클래스로드 메커니즘은 다른 클래스 로더 및 대표 모델을 포함하여 어떻게 작동합니까?Mar 17, 2025 pm 05:35 PM

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

    분산 컴퓨팅에 Java의 RMI (원격 메소드 호출)를 어떻게 사용할 수 있습니까?분산 컴퓨팅에 Java의 RMI (원격 메소드 호출)를 어떻게 사용할 수 있습니까?Mar 11, 2025 pm 05:53 PM

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

    네트워크 통신에 Java의 Sockets API를 어떻게 사용합니까?네트워크 통신에 Java의 Sockets API를 어떻게 사용합니까?Mar 11, 2025 pm 05:53 PM

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

    Java에서 사용자 정의 네트워킹 프로토콜을 어떻게 만들 수 있습니까?Java에서 사용자 정의 네트워킹 프로토콜을 어떻게 만들 수 있습니까?Mar 11, 2025 pm 05:52 PM

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

    See all articles

    핫 AI 도구

    Undresser.AI Undress

    Undresser.AI Undress

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

    AI Clothes Remover

    AI Clothes Remover

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

    Undress AI Tool

    Undress AI Tool

    무료로 이미지를 벗다

    Clothoff.io

    Clothoff.io

    AI 옷 제거제

    AI Hentai Generator

    AI Hentai Generator

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

    인기 기사

    R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
    3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. 최고의 그래픽 설정
    3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
    3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
    3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

    뜨거운 도구

    DVWA

    DVWA

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

    Eclipse용 SAP NetWeaver 서버 어댑터

    Eclipse용 SAP NetWeaver 서버 어댑터

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

    에디트플러스 중국어 크랙 버전

    에디트플러스 중국어 크랙 버전

    작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

    Dreamweaver Mac版

    Dreamweaver Mac版

    시각적 웹 개발 도구

    스튜디오 13.0.1 보내기

    스튜디오 13.0.1 보내기

    강력한 PHP 통합 개발 환경