常见的Java认证授权框架有哪些?

  • Post category:Java

Java认证授权框架是Java EE技术栈中不可或缺的一部分,常见的Java认证授权框架包括Spring Security、Apache Shiro、JAAS等。

  1. Spring Security:

Spring Security是由Spring社区提供的一个安全框架,它提供了一套全面的安全解决方案,用于保护Web应用和服务。Spring Security基于Servlet过滤器,可以集成到Spring MVC Web应用和Spring Boot应用中。

使用Spring Security需要进行以下步骤:

(1)添加依赖:

在Maven中添加以下依赖:

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>5.4.6</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>5.4.6</version>
</dependency>

(2)配置Spring Security:

Spring Security的配置通常写在一个继承自WebSecurityConfigurerAdapter的类中,例如:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/**").permitAll()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll()
                .and()
            .csrf()
                .disable();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .withUser("user").password("password").roles("USER")
                .and()
                .withUser("admin").password("password").roles("ADMIN");
    }
}

这个示例中,我们定义了一个具有两个角色(USER和ADMIN)的简单内存身份验证,用于保护/admin/**下的URL。

(3)使用Spring Security:

在需要进行安全管理的Controller中可以使用Spring Security提供的注解,例如:

@Controller
public class MyController {
    @GetMapping("/admin")
    @PreAuthorize("hasRole('ADMIN')")
    public String admin() {
        return "admin";
    }

    @GetMapping("/user")
    @PreAuthorize("hasAnyRole('USER', 'ADMIN')")
    public String user() {
        return "user";
    }
}

这个示例中,我们在Controller的方法上使用了@PreAuthorize注解来保护/admin和/user两个URL,要求用户必须具有ADMIN或USER角色之一才能访问。

  1. Apache Shiro:

Apache Shiro是一个易于使用的Java安全框架,它提供了身份验证、授权、会话管理和加密等功能。Apache Shiro可以与任何Java应用程序集成,包括Web、桌面和移动应用程序。

使用Apache Shiro需要进行以下步骤:

(1)添加依赖:

在Maven中添加以下依赖:

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-core</artifactId>
    <version>1.7.1</version>
</dependency>
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-web</artifactId>
    <version>1.7.1</version>
</dependency>

(2)配置Apache Shiro:

Apache Shiro的配置通常写在一个shiro.ini文件中,例如:

[main]
ds = org.apache.commons.dbcp.BasicDataSource
ds.url = jdbc:mysql://localhost:3306/test
ds.username = root
ds.password = root

securityManager.realms = myRealm

myRealm = org.apache.shiro.realm.jdbc.JdbcRealm
myRealm.dataSource = $ds
myRealm.permissionsLookupEnabled = true
myRealm.authenticationQuery = SELECT password FROM users WHERE username = ?
myRealm.userRolesQuery = SELECT role_name FROM user_roles WHERE username = ?
myRealm.permissionsQuery = SELECT permission FROM roles_permissions WHERE role_name = ?

[filters]
authc = org.apache.shiro.web.filter.authc.FormAuthenticationFilter
authc.loginUrl = /login.jsp
authc.successUrl = /index.jsp
authc.usernameParam = username
authc.passwordParam = password

[urls]
/login.jsp = authc
/logout = logout
/index.jsp = authc
/admin/** = roles[admin]

这个示例中,我们定义了一个使用JDBC进行身份验证的简单Realm,用于保护/admin/**下的URL。

(3)使用Apache Shiro:

在需要进行安全管理的Controller中可以使用Apache Shiro提供的注解,例如:

@Controller
@RequestMapping("/admin")
public class MyController {
    @RequiresRoles("admin")
    @GetMapping("/user")
    public String user() {
        return "user";
    }
}

这个示例中,我们在Controller的方法上使用了@RequiresRoles注解来保护/admin/user这个URL,要求用户必须具有admin角色才能访问。