下面我将为您讲解如何使用Spring Security实现数据库登录认证和授权。
一、引入依赖
首先,需要在pom.xml文件中引入Spring Security依赖:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
二、配置Spring Security
接下来,需要在Spring MVC的配置文件中配置Spring Security:
<!-- 开启Spring Security -->
<sec:http auto-config="true">
<!-- 忽略静态文件的拦截 -->
<sec:intercept-url pattern="/static/**" access="permitAll"/>
<!-- 其他请求均须登录认证 -->
<sec:intercept-url pattern="/**" access="hasRole('USER')"/>
<!-- 登录页面 -->
<sec:form-login login-page="/login" default-target-url="/index" authentication-failure-url="/login?error=true"/>
<!-- 退出登录处理 -->
<sec:logout logout-success-url="/login?logout=true"/>
</sec:http>
<!-- 引入数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
<!-- 配置用户和权限信息 -->
<sec:authentication-manager>
<sec:authentication-provider>
<sec:jdbc-user-service data-source-ref="dataSource"
users-by-username-query="select username, password, enabled from users where username = ?"
authorities-by-username-query="select u.username, a.authority from users u, authorities a where u.username = ? and u.id = a.user_id"/>
</sec:authentication-provider>
</sec:authentication-manager>
上述配置中,我们使用<sec:http>
标签开启了Spring Security,并配置了静态文件和其他请求的权限。我们还通过<sec:form-login>
标签配置了自定义的登录页面,并指定了登录成功和失败的跳转页面。最后,我们用<sec:jdbc-user-service>
标签配置了数据源,用于查询用户和权限信息。
三、创建用户和权限表
在上述配置中,我们指定了用于查询用户和权限信息的SQL语句,因此需要在数据库中创建相应的用户和权限表:
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(255) NOT NULL,
`enabled` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`)
);
CREATE TABLE `authorities` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`authority` varchar(50) NOT NULL,
PRIMARY KEY (`id`),
KEY `fk_authorities_users` (`user_id`),
CONSTRAINT `fk_authorities_users` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
);
四、编写登录页面和首页
接下来,需要在页面上创建登录页面和首页。登录页面需要提供表单提交的相关参数,如用户名和密码等信息。首页则可以是一个简单的欢迎页面,用于显示登录用户的信息。
<!-- 登录页面 -->
<form action="/login" method="post">
<label>用户名:</label>
<input type="text" name="username" /><br/>
<label>密码:</label>
<input type="password" name="password" /><br/>
<input type="submit" value="登录" />
</form>
<!-- 首页 -->
<h1>欢迎您,${username}!</h1>
五、创建Controller
最后,需要创建Controller来处理用户登录和首页请求。以下示例代码展示了如何使用Spring Security来获取当前登录用户的用户名信息:
@Controller
public class HomeController {
@GetMapping("/")
public String home(Model model, Principal principal) {
String username = principal == null ? null : principal.getName();
model.addAttribute("username", username);
return "home";
}
@GetMapping("/login")
public String login(HttpServletRequest request, HttpServletResponse response) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null && !auth.getName().equals("anonymousUser")) {
return "redirect:/";
}
return "login";
}
}
上述代码中,home()
方法获取当前登录用户的用户名信息,并将其存入Model
中,用于在首页页面中显示。login()
方法获取当前用户的认证信息,并判断是否已经登录,如果已经登录则直接跳转到首页。
六、示例说明
以下是一个完整的Spring Security使用数据库登录认证授权的示例:
该示例包含了一个完整的Spring MVC项目,其中包含了登录页面和首页的HTML文件,以及Spring配置文件和Controller等代码,可以作为使用Spring Security实现数据库登录认证和授权的参考。
希望对您有所帮助!
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Security使用数据库登录认证授权 - Python技术站