Java认证授权框架是Java EE技术栈中不可或缺的一部分,常见的Java认证授权框架包括Spring Security、Apache Shiro、JAAS等。
- 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角色之一才能访问。
- 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角色才能访问。