我使用Spring安全性来保护用户名和密码登录到应用程序管理部分。但是现在我的客户端需要为应用程序客户端部分提供另一个登录屏幕,他们将拥有自己的用户名/密码来登录客户端部分。到目前为止,我已经使用以下spring-security.xml设置成功实现了admin部分登录:
<security:http auto-config="true" use-expressions="true">
<security:form-login login-page="/login"
default-target-url="/admin/dashboard" always-use-default-target="true"
authentication-failure-url="/login/admin?error_msg=wrong username or password" />
<security:intercept-url pattern="/admin/*" access="hasRole('ROLE_ADMIN')" />
<security:logout logout-success-url="/login"/>
</security:http>
<security:authentication-manager>
<security:authentication-provider
user-service-ref="adminServiceImpl">
</security:authentication-provider>
</security:authentication-manager>
我在网上搜索了很多,试图找到我如何添加客户端部分登录屏幕,拦截网址,安全认证提供商但找不到任何信息,所以有人可以帮我任何链接到任何教程/示例,指导如何操作?
由于
答案 0 :(得分:5)
从Spring Security 3.1开始,现在可以使用多个http 用于定义单独的安全过滤器链配置的元素 不同的请求模式。如果省略pattern属性 一个http元素,它匹配所有请求。
每个元素在内部FilterChainProxy和应映射到它的URL模式中创建一个过滤器链。元素将按声明的顺序添加,因此必须首先声明最具体的模式。
因此,基本上您需要两个<http>
个元素,每个元素都有不同的pattern
属性。
这里有一个详细的教程:https://blog.codecentric.de/en/2012/07/spring-security-two-security-realms-in-one-application/
答案 1 :(得分:3)
我只会使用一个security:http
,但会注册两个UsernamePasswordLoginFilter
。
如果两个Login-Pages属于同一个安全领域,那么这个解决方案是合适的。 (因此,如果用户登录的登录页面无关紧要)。当然,您仍然可以使用角色来限制应用程序的不同部分对不同类型用户的访问。
此解决方案应该非常简单,因为您不需要处理两个security:http
部分。
这样做的主要缺点是:如果用户尝试访问需要登录的页面,则必须确定未登录用户的两个登录页面中的哪一个被重定向。
答案 2 :(得分:2)
具有多种登录表单的Spring MVC App的示例项目。
三种类型的页面普通/会员/管理员。 如果您尝试访问会员页面,则会被带到会员登录表单。 如果您尝试访问管理员页面,请转到管理员登录表单。
https://github.com/eric-mckinley/springmultihttploginforms
在seucrity xml配置文件中使用ant regex请求匹配器完成。
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd">
<global-method-security secured-annotations="enabled" />
<http name="member" pattern="/member/*" request-matcher="ant" auto-config="true" use-expressions="false">
<csrf disabled="true"/>
<intercept-url pattern="/member/home" access="ROLE_MEMBER" />
<intercept-url pattern="/member/account" access="ROLE_MEMBER" />
<intercept-url pattern="/member/orders" access="ROLE_MEMBER" />
<form-login login-page="/member-login" always-use-default-target="false"/>
<logout logout-url="/logout" logout-success-url="/home"/>
</http>
<http name="admin" request-matcher="regex" auto-config="true" use-expressions="false">
<csrf disabled="true"/>
<intercept-url pattern="/admin/home" access="ROLE_ADMIN" />
<intercept-url pattern="/admin/users" access="ROLE_ADMIN" />
<form-login login-page="/admin-login" always-use-default-target="false"/>
<logout logout-url="/logout" logout-success-url="/home"/>
</http>
<authentication-manager>
<authentication-provider>
<user-service>
<user name="admin" password="password" authorities="ROLE_ADMIN" />
<user name="member" password="password" authorities="ROLE_MEMBER" />
<user name="super" password="password" authorities="ROLE_ADMIN,ROLE_MEMBER" />
</user-service>
</authentication-provider>
</authentication-manager>
答案 3 :(得分:0)
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.0.xsd“>
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/" access="permitAll" />
<intercept-url pattern="/login" access="permitAll" />
<!-- <intercept-url pattern="/welcome/**" access="permitAll" /> <intercept-url
pattern="/admin*" access="hasRole('ROLE_ADMIN')" /> -->
<intercept-url access="hasRole('ROLE_USER')" pattern="/main*" />
<intercept-url pattern="/main*" access="hasRole('ROLE_USER')" />
<form-login login-page="/login" default-target-url="/login-success"
authentication-failure-url="/loginError" />
<!-- <session-management invalid-session-url="/login" session-fixation-protection="newSession">
<concurrency-control max-sessions="1" error-if-maximum-exceeded="true" />
</session-management> -->
<logout logout-success-url="/login" delete-cookies="JSESSIONID" />
<csrf disabled="true" />
<headers>
<frame-options policy="SAMEORIGIN" />
</headers>
</http>
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/mobile/" access="permitAll" />
<intercept-url pattern="/mobile/login" access="permitAll" />
<!-- <intercept-url pattern="/welcome/**" access="permitAll" /> <intercept-url
pattern="/admin*" access="hasRole('ROLE_ADMIN')" /> -->
<intercept-url access="hasRole('ROLE_USER')" pattern="/main*" />
<intercept-url pattern="/main*" access="hasRole('ROLE_USER')" />
<form-login login-page="/mobile/login" default-target-url="/mobile/login-success"
always-use-default-target="true" authentication-failure-url="/mobile/login?error"
username-parameter="username" password-parameter="password" />
<logout delete-cookies="JSESSIONID" logout-success-url="/mobile/login" />
<csrf disabled="true" />
<headers>
<frame-options policy="SAMEORIGIN" />
</headers>
在这里,我需要所有用户共有的两个登录表单。我已经在spring-security.xml中配置了标签元素,但是它不起作用。请给我建议解决方案